home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Tools
/
HRTmon
/
src
/
HRTmonV2.s
< prev
next >
Wrap
Text File
|
1999-11-06
|
212KB
|
11,346 lines
;HRTmon Amiga system monitor
;Copyright (C) 1991-1998 Alain Malek Alain.Malek@cryogen.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You can find the full GNU GPL online at: http://www.gnu.org
*******************************
** HRTmon v2.17 **
*******************************
** code by Alain Malek ***
*******************************
***********************************************************
IFD BARFLY
MC68030
SUPER ;disable supervisor warnings
BOPT w4- ;disable 64k warnings
OUTPUT "hrtmon.data.basm"
OPT_OFF MACRO
BOPT OD6- ;disable branch optimizing
ENDM
OPT_ON MACRO
BOPT OD6+ ;enable branch optimizing
ENDM
ENDC
IFD _PHXASS_
MC68030
OPT NBL
OPT_OFF MACRO
OPT 0
ENDM
OPT_ON MACRO
OPT NBL
ENDM
ENDC
IFND BARFLY
IFND _PHXASS_
MC68030 MACRO
ENDM
MC68040 MACRO
ENDM
OPT_ON MACRO
ENDM
OPT_OFF MACRO
ENDM
ENDC
ENDC
***********************************************************
SC_STEP equ 16 ;fast scrolling step
LOSIZE equ $9800 ;size of lowmem backuped
MAX_SCREEN equ 52
version macro
dc.b "2.17"
endm
incdir include:
include exec/tasks.i
include hardware/custom.i
***********************************************************
include exec/types.i
include exec/execbase.i
include devices/hardblocks.i
incdir hrt:
***********************************************************
;-------------- MACRO same as corr_addr subroutine --------
CORR_ADDR: macro
clr.l corr_val
cmpa.l #LOSIZE-64,a4
bge.b .ok_low\1
add.l #backup_pic,a4
move.l #backup_pic,corr_val
.ok_low\1:
endm
***********************************************************
start ;bra.w monitor
moveq #0,d0
rts
dc.b "HRT!" ;4
OPT_OFF
bra.w mon_install ;8 jmp to install routine
bra.w monitor ;12 jmp to monitor
bra.w mon_remove ;16 jmp to remove routine
OPT_ON
mon_size dc.l 0 ;20 size of HRTmon (for FreeMem)
config_RM dc.b 0 ;24 -1=right-mouse enter on 0=off
config2 dc.b 0 ;25 no of keyboard to use
config_key dc.b 0 ;26 -1= \ key enter on 0=off
config_IDE dc.b 0 ;27 -1= IDE harddisk
config_A1200 dc.b 0 ;28 -1= A1200
config_AGA dc.b 0 ;29 -1= AGA
config_insert dc.b 0 ;30 -1= insert
config_delay dc.b 15 ;31 repeat key delay (default = 15)
config_lview dc.b 0 ;32 -1= lview task
config_elsat dc.b 0 ;33 -1=elsat.device IDE (CD32)
config_screen dc.b 0 ;34 screen mode no 0=PAL,1=NTSC,2=MULTISCAN
even
mon_remove movem.l d1-a6,-(a7)
move.l $4.w,a6
lea.l .super(pc),a5
jsr -30(a6)
move.l mon_size(pc),d0
beq.b .nofree
lea.l start(pc),a1
jsr -210(a6) ;FreeMem
.nofree
tst.b config_lview
beq.b .nolview
move.l $4.w,a6
move.l gfxbase(pc),a1
jsr -414(a6)
lea.l tc_block(pc),a1
jsr -288(a6) ;RemTask
.nolview
movem.l (a7)+,d1-a6
moveq #0,d0
rts
.super movec VBR,a4
move.l oldlev7(pc),$7c(a4)
move.l old_vbr(pc),a4
movec a4,VBR
rte
mon_install movem.l d1-a6,-(a7)
lea.l start(pc),a0
move.w #28,screen_height
cmp.b #1,config_screen
bne.b .nontsc
move.w #22,screen_height
.nontsc cmp.b #2,config_screen
bne.b .nomulti
move.w #52,screen_height
.nomulti
move.w #MAX_SCREEN,d2
sub.w screen_height,d2
mulu #80,d2
move.l d2,d1
add.l #ascII_page1,d1
move.l d1,ascII_ptr
move.l d1,ascII_ptr+4
move.l d2,d1
add.l #ascII_page2,d1
move.l d1,ascII_ptr+8
move.l d2,d1
add.l #ascII_Tracer,d1
move.l d1,ascII_ptr+12
move.w screen_height,d1
subq.w #4,d1
move.w d1,window_bot
move.l a0,location
move.l $4.w,a6
move.l MaxLocMem(a6),max_chip
lea.l .super(pc),a5
jsr -30(a6)
tst.b config_IDE
beq.w .noide
tst.b config_elsat
beq.b .noelsat
move.l #$eb8000,ide_base
clr.l ide_irq
move.w #$0,ide_data
move.w #$100,ide_error
move.w #$100,ide_feature
move.w #$200,ide_secnt
move.w #$300,ide_secnb
move.w #$400,ide_cyllo
move.w #$500,ide_cylhi
move.w #$600,ide_dhead
move.w #$700,ide_status
move.w #$700,ide_command
move.w #$4600,ide_altstat
bra.w .noide
.noelsat move.w #$0,ide_data
move.w #$4,ide_error
move.w #$4,ide_feature
move.w #$8,ide_secnt
move.w #$c,ide_secnb
move.w #$10,ide_cyllo
move.w #$14,ide_cylhi
move.w #$18,ide_dhead
move.w #$1c,ide_status
move.w #$1c,ide_command
move.w #$1c,ide_altstat
move.l #$da2000,ide_base
move.l #$da9000,ide_irq
tst.b config_A1200 ;A1200 ?
bne.b .noide
move.l #$dd2020,ide_base
move.l #$dd3020,ide_irq
.noide
move.b config_insert(pc),insert_mode
moveq #0,d0
move.b config2,d0 ;keyboard map
mulu #12,d0
movem.l .map(pc,d0.l),d0-d2
movem.l d0-d2,board_ptr
tst.b config_lview
beq.b .nolview
lea.l gfxname(pc),a1
moveq #0,d0
move.l $4.w,a6
jsr -552(a6)
move.l d0,gfxbase
move.l #lview_name,tc_block+LN_NAME
move.b #NT_TASK,tc_block+LN_TYPE
move.b #8,tc_block+LN_PRI
move.l #task_stackend,tc_block+TC_SPREG
move.l #task_stack,tc_block+TC_SPLOWER
move.l #task_stackend,tc_block+TC_SPUPPER
lea.l tc_block(pc),a1
lea.l task_code(pc),a2
sub.l a3,a3
jsr -282(a6) ;AddTask
.nolview
movem.l (a7)+,d1-a6
moveq #0,d0
rts
cnop 0,4
.map dc.l board3, board4, board4a
dc.l board1, board2, board2a
dc.l board5, board6, board6a
dc.l board7, board8, board8a
.super bsr test_CPU
move.w d0,proc_type
movec VBR,a4
move.l a4,old_vbr
lea.l new_except,a0
move.l a0,a1
lea.l except_entry(pc),a2
move.w #$400/4-1,d1
.init move.l a2,(a1)+
dbf d1,.init
suba.l a1,a1
move.w #$400/4-1,d1
.copy move.l (a4)+,(a1)+
dbf d1,.copy
move.l $7c(a0),oldlev7
move.l #monitor,$7c(a0)
movec a0,VBR
move.l #zlevel7,$7c.w
rte
zlevel7: movem.l a0,-(a7)
lea.l new_except,a0
movec a0,VBR
movem.l (a7)+,a0
jmp monitor
cnop 0,4
gfxbase dc.l 0
wbview dc.l 0
signal_no dc.l 0
changed_disk dcb.l 16,0
gfxname dc.b "graphics.library",0
;dosname dc.b "dos.library",0
lview_name dc.b "HRTmon system task",0
cnop 0,4
tc_block dcb.b TC_SIZE,0
task_stack dcb.b $400,0
task_stackend
task_code
move.l $4.w,a6
moveq #-1,d0
jsr -330(a6) ; AllocSignal
move.l d0,signal_no
.loop move.l signal_no(pc),d0
move.l $4.w,a6
jsr -318(a6) ; Wait
move.l gfxbase(pc),a6
move.l wbview(pc),a1
jsr -222(a6) ; LoadView Fix view
move.l 38(a6),$dff080 ; Kick it into life
bra.b .loop
;experimental code removed should be done from a PROCESS
; move.l $4.w,a6
; lea.l dosname(pc),a1
; moveq #0,d0
; jsr -552(a6)
; tst.l d0
; beq.b .nodos
; move.l d0,a6
;
; lea.l changed_disk(pc),a4
; moveq #16-1,d7
;.next move.l (a4)+,d0
; beq.b .empty
;
; move.l d0,a0
; lea.l part_name2(a0),a0
; moveq #0,d0
; lea.l .tmp_name(pc),a1
; move.b (a0)+,d0
;.copy move.b (a0)+,(a1)+
; dbf d0,.copy
; move.b #':',(a1)+
; sf (a1)+
;
; clr.l -4(a4)
;
; move.l d7,-(a7)
;
; move.l #.tmp_name,d1
; jsr -174(a6) ; DeviceProc
; tst.l d0
; beq.b .err
; move.l d0,a3
; move.l a3,d1
; moveq #$1f,d2
; moveq #-1,d3
; moveq #0,d4
; moveq #0,d5
; moveq #0,d6
; moveq #0,d7
; jsr -240(a6) ; DoPkt
; tst.l d0
; beq.b .err
; move.l a3,d1
; moveq #$1f,d2
; moveq #0,d3
; moveq #0,d4
; moveq #0,d5
; moveq #0,d6
; moveq #0,d7
; jsr -240(a6) ; DoPkt
;.err
; move.l (a7)+,d7
;
;.empty dbf d7,.next
;
; move.l a6,a1
; move.l $4.w,a6
; jsr -414(a6)
;
;.nodos
; bra.w .loop
;
; rts
;.tmp_name dcb.b 34,0
cnop 0,4
max_chip dc.l 0 ;maximum value for CHIP-RAM
oldlev7 dc.l 0
old_vbr dc.l 0
except_entry
tst.b config_RM
beq.b .noright
btst #10-8,$dff016
beq.w monitor
.noright
tst.b config_key
beq.b .nokey
cmp.b #$e5,$bfec01
beq.w monitor
.nokey
movem.l d0/a0,-(a7)
move.w 8+6(a7),d0
and.w #$fff,d0
move.w d0,a0
move.l (a0),.jmp_addr
movem.l (a7)+,d0/a0
move.l .jmp_addr(pc),-(a7)
rts
cnop 0,4
.jmp_addr dc.l 0
cnop 0,16
location dc.l 0 ;HRTmon location
dc.b "HRT!"
new_except dcb.l $100,0
dc.b "ATZ!"
dc.l monitor ;trap vector
dc.b "HRTmon "
version
dc.b " "
dc.b "by Alain Malek "
dc.b "(Hornet of Alcatraz) "
cnop 0,4
pic_ptr dc.l $4b0 ;address used for the bitplan of AR
h=9 ;heights between two lines
;-------------- init. HRTmon when entered for the 1st time ----
init_code movem.l d0-a6,-(a7)
move.l #$12345678,d0
tst.w Reset_Flag
bne.b .init
cmp.l inited,d0
beq.w .noinit
.init move.l d0,inited
bsr test_CPU
move.w d0,proc_type
bsr init_ascII
jsr test_drive ;test which floppy drive is present
tst.b drive_present+1
beq.b .noDF1
move.l #floppy1,floppy0 ;add DF1: partition
.noDF1
move.w proc_type,d0
add.b #'0',d0
move.b d0,mc_txt+5
jsr init_fbuffer
tst.b config_IDE
beq.b .noide
move.l ide_irq,d0
beq.b .noIDEirq
move.l d0,a3
tst.b (a3)
bpl.b .noIDEirq
move.l ide_base,a3
tst.b config_A1200
bne.b .go1200
move.w ide_status,d0
move.b (a3,d0.w),d0
bra.b .noIDEirq
.go1200 jsr wait_irq ;remove IRQ request from IDE
.noIDEirq
jsr find_part
.noide
lea.l custom,a1
move.w #$4489,$7e(a1)
move.w #$20,$1dc(a1)
move.w #$3081,$8e(a1)
move.w #$30c1,$90(a1)
move.w #$0038,$92(a1)
move.w #$00d0,$94(a1)
move.w #0,$108(a1)
move.w #0,$10a(a1)
move.w #0,$106(a1)
move.w #0,$1fc(a1)
move.w #$9200,$100(a1)
move.w #0,$102(a1)
.noinit movem.l (a7)+,d0-a6
rts
;test if exec is here and valid
;d0=0 ok, -1 = no system
exec_here movem.l d1/a0-a1,-(a7)
move.l $4.w,a0
move.l a0,d0
lsr.l #1,d0
bcs.b .nosafe
lea.l 34(a0),a1
moveq #0,d0
moveq #$18-1,d1
.add add.w (a1)+,d0
dbf d1,.add
not.w d0
cmp.w 82(a0),d0
bne.b .nosafe
moveq #0,d0
bra.b .ok
.nosafe moveq #-1,d0
.ok movem.l (a7)+,d1/a0-a1
rts
cnop 0,4
;-------------- when in AR VBR points here ----------------
AR_vbr
dc.l error,error,error,error ;$00-$0c
dc.l error,error,error,error ;$10-$1c
dc.l error,error,error,error ;$20-$2c
dc.l error,error,error,error ;$30-$3c
dc.l error,error,error,error ;$40-$4c
dc.l error,error,error,error ;$50-$5c
dc.l error,error ;$60,$64
dc.l newirq2 ;$68 ;keyboard irq
dc.l newirq ;$6c ;VBL irq
dc.l error ;$70
dc.l error ;$74
dc.l error ;$78
dc.l .onlyret ;$7c
dc.l error,error,error,error ;$80-$8c
dc.l error,error,error,error ;$90-$9c
dc.l error,error,error,error ;$a0-$ac
dc.l error,error,error,error ;$b0-$bc
dc.l error,error,error,error ;$c0-$cc
dc.l error,error,error,error ;$d0-$dc
dc.l error,error,error,error ;$e0-$ec
dc.l error,error,error,error ;$f0-$fc
.onlyret rte
;-------------- jmp here if an unexpected exception is raised ----------
;-------------- (should never happen !) --------------------------------
error move.w #$2700,sr
move.l 2(a7),start
move.w (a7),start+4
move.w 6(a7),start+6
.loop move.w #0,$dff106
move.w $dff006,$dff180 ;flash screen
bra.b .loop
cnop 0,4
**************************************************************************
;-------------- Entry point of the Action Replay -------------------------
entered dc.b 0 ;bit 0 set if in HRTmon
cnop 0,4
monitor move.l a0,-(a7)
lea.l entered(pc),a0
bset #0,(a0)
beq.b .enter
move.l (a7)+,a0
rte ;don't enter twice
.enter
move.l (a7)+,a0
move.w #$2700,sr
movem.l d0-a7,registres
lea.l stack,a7 ;Own stack
;now bsr are allowed
bsr ClearCache
tst.b config_lview
beq.b .nolview
bsr exec_here
bne.b .nolview
move.l gfxbase(pc),a6
move.l 34(a6),d0 ;get actual view
beq.b .nolview
move.l d0,wbview
sub.l a1,a1
jsr -222(a6) ;LoadView(NULL)
move.l signal_no(pc),d0
lea.l tc_block(pc),a1
move.l $4.w,a6
jsr -324(a6) ;Signal
.nolview
bsr init_code
bsr ClearCache
cmp.w #4,proc_type
blt.b .notrans0
MC68040
movec itt0,d0
move.l d0,itt0_reg
movec itt1,d0
move.l d0,itt1_reg
movec dtt0,d0
move.l d0,dtt0_reg
movec dtt1,d0
move.l d0,dtt1_reg
move.l #$0000a040,d0
movec d0,itt0
movec d0,dtt0
moveq #0,d0
movec d0,itt1
movec d0,dtt1
movec tc,d0
move.l d0,tc_reg
cpusha bc
cinva bc
dc.w $f518 ;pflusha
MC68030
.notrans0
lea.l $dff000,a6
move.l $4(a6),OldRaster ;save raster pos
;(wrong coz of .waittrap !)
.blit btst #6,($2,a6)
bne.b .blit ;wait end of blitter operation
move.l a7_reg,a0
move.w (a0),sr_reg
move.l 2(a0),pc_reg
btst #5,$bfe001 ;need to wait end of DMA disk ?
bne.b .no_drive
move.l #$20000,d1
.loop subq.l #1,d1
beq.b .no_drive
move.w $1e(a6),d0 ;wait for DMAdisk IRQ
and.w #2,d0
beq.b .loop
.no_drive
move.l USP,a0
move.l a0,usp_reg
move.l a7_reg,ssp_reg
move.w sr_reg,d0
and.w #$2000,d0
bne.b ok_ssp_a7
move.l a0,a7_reg
ok_ssp_a7 movec VBR,d0
move.l d0,vbr_reg
movec CACR,d0
move.l d0,cacr_reg
moveq #0,d0
cmp.w #6,proc_type
bne.b .no60
move.l #'BUSR',CAAR_txt
dc.w $4e7a,$0008 ;movec BUSCR,d0
bra.b .nocaar
.no60 cmp.w #4,proc_type
bge.b .nocaar
movec CAAR,d0
.nocaar move.l d0,caar_reg
move.l ssp_reg,isp_reg
move.l ssp_reg,d0
cmp.w #6,proc_type ;68060 ?
beq.b .nomsp
movec MSP,d0
bra.b .okmsp
.nomsp move.l #'PCR=',MSP_txt
dc.w $4e7a,$0808 ;movec PCR,d0
.okmsp move.l d0,msp_reg
cmp.w #4,proc_type
bge.b .no23
or.w #$2111,d0 ;switch all CACHE ON
movec d0,CACR ;(68020/68030 only)
.no23
lea.l (AR_vbr,pc),a0
movec a0,VBR ;init AR vbr
bsr save_custom
bsr save_CIA
move.l #-1,trace_address
;-------------- don't trace subroutine in tracer ? --------
tst.b trace_bsr
beq.b .no_bsr
tst.w trace_count
beq.b .oky
clr.w trace_count
sf trace_bsr
bra.b .no_bsr
.oky
move.w sr_reg,d0
move.l a7_reg,a0
and.w #$2000,d0
beq.b .no_super
addq.l #6,a0 ;skip SR and PC
move.w (a0),d0 ;read stack frame no
lsr.w #4,d0
lsr.w #8,d0
lea.l frame(pc),a4
add.w (a4,d0.w*2),a0 ;add stack frame size
.no_super move.l (a0),tracer_old_rts
move.l #.tracer_rts,(a0)
move.l vbr_reg,a4
move.l #.tracer_ill,$10(a4)
sf trace_bsr
bra.b .out
.tracer_rts illegal
.tracer_ill move.l tracer_old_rts,2(a7)
bra.w monitor
.no_bsr
;-------------------------------------------
bsr ClearCache
bsr.w super ;enter editor
.out move.w #$7fff,d0
move.w d0,$9a(a6)
move.w d0,$96(a6)
move.w d0,$9c(a6)
bsr restore_CIA
bsr restore_custom
cmp.w #6,proc_type ;68060 ?
beq.w .nomsp2
move.l msp_reg,a0
movec a0,MSP
bra.b .okmsp2
.nomsp2 move.l msp_reg,a0
dc.w $4e7b,$8808 ;movec a0,PCR
.okmsp2
move.l usp_reg,a0
move.l a0,USP
move.l ssp_reg,a7
move.w sr_reg,(a7)
move.l vbr_reg,a4
tst.w trace_count
beq.b trace_off
st no_kill ;don't kill AR on exit
or.w #$8000,(a7)
move.l $24(a4),old_trace
lea.l trace_reach(pc),a0
move.l a0,$24(a4)
trace_off cmp.l #-1,trace_address
beq.b tracea_off
st no_kill ;don't kill AR on exit
or.w #$8000,(a7)
move.l $24(a4),old_trace
lea.l tracea_reach(pc),a0
move.l a0,$24(a4)
tracea_off
move.l pc_reg,2(a7)
tst.b debug ;debug mode on ?
beq.b .nodebug
st no_kill ;don't kill AR on exit
.nodebug
bsr ClearCache
cmp.w #6,proc_type
bne.b .no60
move.l caar_reg,a0
dc.w $4e7b,$8008 ;movec a0,BUSCR
.no60 cmp.w #4,proc_type
bge.b .nocaar2
move.l caar_reg,a0
movec a0,CAAR
.nocaar2 move.l cacr_reg,d0
movec d0,CACR ;restore CACR
cmp.w #4,proc_type
blt.b .notrans
MC68040
move.l itt0_reg,d0
movec d0,itt0
move.l itt1_reg,d0
movec d0,itt1
move.l dtt0_reg,d0
movec d0,dtt0
move.l dtt1_reg,d0
movec d0,dtt1
cpusha bc
cinva bc
dc.w $f518 ;pflusha
MC68030
.notrans
move.l custom+$4,d0
lsr.l #1,d0
lsr.w #7,d0
.raster move.l $4(a6),d1 ;wait raster pos
lsr.l #1,d1 ;for exit
lsr.w #7,d1
cmp.w d0,d1
; bne.b .raster
tst.b reboot
beq.b .noreboot
sf reboot
lea.l $50000,a0
lea.l start,a1
move.w #$2f000/4-1,d0
.copy move.l (a1)+,(a0)+ ;copy HRTmon to $50000
dbf d0,.copy
.noreboot tst.b kill
beq.b .nokill
move.l old_vbr(pc),a0
movec a0,VBR
bra.b .okkill
.nokill move.l vbr_reg,a0
movec a0,VBR
.okkill movem.l registres,d0-d7/a0-a6
sf entered
rte
*************************************************************
;Clear instruction and data cache of 68020,68030,68040,68060
ClearCache move.l d0,-(a7)
cmp.w #4,proc_type
bge.b .cic_040
movec CACR,d0
cmp.w #3,proc_type
bne.b .no30
or.w #$0800,d0
.no30 or.w #$8,d0
movec d0,CACR
bra.b .end
.cic_040
MC68040
cpusha BC
cinva BC
MC68030
.end
move.l (a7)+,d0
rts
***********************************************************
;test if 68020,30,40,or 60 processor
;<- d0=processor type 2=68020,3=68030,4=68040,6=68060
test_CPU move.w #$2700,sr
movem.l d1-d2/a0/a4,-(a7)
movec VBR,a0
move.l a0,.old_vbr
lea.l .except,a0
movec a0,VBR
move.l a7,a4
moveq #1,d0
moveq #1,d1
moveq #1,d2
move.l #.mc60,($f4,a0) ;new unimplemented instr.
muls.l d0,d1:d2 ;68060 ? (not implemented on 060)
MC68040
move.l #.mc23,($10,a0) ;new illegal
movec URP,d0 ;68040 and 68060 only
MC68030
moveq #4,d0
bra.b .out
.ret23 move.l #.mc20,($2c,a0) ;new F-line
pflusha ;030 MMU instruction
moveq #3,d0
.out move.l a4,a7
move.l .old_vbr,a0
movec a0,VBR
movem.l (a7)+,d1-d2/a0/a4
move.w #$2700,sr
rts
.mc60 moveq #6,d0
move.l #.out,(2,a7)
rte
.mc23 move.l #.ret23,(2,a7)
rte
.mc20 moveq #2,d0
move.l #.out,(2,a7)
rte
.old_vbr dc.l 0
.kill rte
cnop 0,4
.except dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
***********************************************************
;-------------- save custom registers ---------------------
;-------------- palette saving done by read_palette -------
save_custom movem.l d0/a0-a4,-(a7)
; lea.l Action_CUST,a0
lea.l custom,a1
move.l a1,a4
; move.w #$200/8-1,d0
;.copy move.l (a0)+,(a1)+
; move.l (a0)+,(a1)+
; dbf d0,.copy
move.w $2(a6),d0
move.w d0,2(a4)
or.w #$8000,d0
move.w d0,$96(a4) ;DMACON
move.w #$7fff,$96(a6)
move.w $1c(a6),d0
move.w d0,$1c(a4)
or.w #$8000,d0
move.w d0,$9a(a4) ;INTENA
move.w #$7fff,$9a(a6)
move.w $1e(a6),d0
move.w d0,$1e(a4)
or.w #$8000,d0
move.w d0,$9c(a4) ;INTREQ
move.w #$7fff,$9c(a6)
tst.b config_A1200
beq.b .noa1200
move.b $daa000,pcmcia_intena
move.b #0,$daa000 ;disable pcmcia interrupts
move.b $da9000,d0
eor.b #$2c,d0
and.b #$c0,d0
move.b d0,$da9000 ;ack pending interrupts
.noa1200
move.w $10(a6),d0
move.w d0,$10(a4)
or.w #$8000,d0
move.w d0,$9e(a4) ;ADKCON
move.l OldRaster,$4(a4) ;VPOSR,VHPOSR
lea.l $a(a6),a0
lea.l $a(a4),a1
moveq #9-1,d0
.copy1 move.w (a0)+,(a1)+
dbf d0,.copy1
move.w $7c(a6),$7c(a4) ;LISAID
move.w $1da(a6),$1da(a4) ;HHPOSR
; moveq #0,d0
; jsr analyse_copper
movem.l (a7)+,d0/a0-a4
rts
;-------------- restore custom registers ------------------
restore_custom movem.l d0/a1,-(a7)
lea.l custom,a1
;move.l $20(a1),$20(a6) ;DISKPTR
move.w $7e(a1),$7e(a6) ;DSKSYNC
move.w $9e(a1),$9e(a6) ;ADKCON
;move.w $34(a1),$34(a6) ;POTGO
move.w $1dc(a1),$1dc(a6) ;BEAMCON0
;move.w $1e4(a1),$1e4(a6) ;DIWHIGH
move.l $8e(a1),$8e(a6) ;diwstrt/stop
move.l $92(a1),$92(a6) ;ddfstrt/stop
;move.l $e0(a1),$e0(a6) ;BPL1PT
move.w $1fc(a1),$1fc(a6) ;FMODE
move.l $108(a1),$108(a6) ;BPL1MOD
move.w $106(a1),$106(a6) ;BPLCON3
move.l $100(a1),$100(a6) ;BPLCON0
;move.w $10c(a1),$10c(a6) ;BPLCON4
move.w $96(a1),$96(a6) ;DMACON
move.w $9c(a1),$9c(a6) ;INTREQ
move.w $9a(a1),$9a(a6) ;INTENA
tst.b config_A1200
beq.b .noa1200
move.b pcmcia_intena,$daa000
.noa1200
; move.l $84(a1),d0 ;correct
; cmp.l #$f28,d0 ;an AmigaOS
; bne.b .nof28 ;problem
; tst.l $f28.w ;of the LoadView(NULL)
; bne.b .nof28
; move.l #$f24,$84(a1)
; move.l #$f24,$84(a6)
;.nof28
movem.l (a7)+,d0/a1
rts
save_CIA movem.l a0-a1,-(a7)
; lea.l Action_CIAA,a0
; lea.l CIAA,a1
; move.b $1(a0),(a1)+
; move.b $101(a0),(a1)+
; move.b $201(a0),(a1)+
; move.b $301(a0),(a1)+
; move.b $401(a0),(a1)+
; move.b $501(a0),(a1)+
; move.b $601(a0),(a1)+
; move.b $701(a0),(a1)+
; move.b $801(a0),(a1)+
; move.b $901(a0),(a1)+
; move.b $a01(a0),(a1)+
; move.b $b01(a0),(a1)+
; move.b $c01(a0),(a1)+
; move.b $d01(a0),(a1)+
; move.b $e01(a0),(a1)+
; move.b $f01(a0),(a1)+
;
; lea.l Action_CIAB,a0
; lea.l CIAB,a1
; move.b (a0),(a1)+
; move.b $100(a0),(a1)+
; move.b $200(a0),(a1)+
; move.b $300(a0),(a1)+
; move.b $400(a0),(a1)+
; move.b $500(a0),(a1)+
; move.b $600(a0),(a1)+
; move.b $700(a0),(a1)+
; move.b $800(a0),(a1)+
; move.b $900(a0),(a1)+
; move.b $a00(a0),(a1)+
; move.b $b00(a0),(a1)+
; move.b $c00(a0),(a1)+
; move.b $d00(a0),(a1)+
; move.b $e00(a0),(a1)+
; move.b $f00(a0),(a1)+
move.b #$c0,$bfd200 ;reinit CIAs
move.b #$ff,$bfd300 ;for
move.b #$03,$bfe201 ;AR
; move.b #$7f,$bfec01
move.b #$00,$bfee01
move.b #$88,$bfed01
move.b #$ff,$bfd100
sf mot_on
move.w #$0f00,$34(a6) ;reinit right-mouse button
movem.l (a7)+,a0-a1
rts
restore_CIA movem.l a0-a1,-(a7)
; lea.l $bfe000,a0
; lea.l CIAA,a1
; clr.b $e01(a0)
; clr.b $f01(a0)
; move.b (a1),$1(a0)
; move.b 1(a1),$101(a0)
; move.b 2(a1),$201(a0)
; move.b 3(a1),$301(a0)
; move.b 4(a1),$401(a0)
; move.b 5(a1),$501(a0)
; move.b 6(a1),$601(a0)
; move.b 7(a1),$701(a0)
; move.b 8(a1),$801(a0)
; move.b 9(a1),$901(a0)
; move.b 10(a1),$a01(a0)
; move.b 11(a1),$b01(a0)
; move.b 12(a1),$c01(a0)
; move.b 14(a1),$e01(a0)
; move.b 15(a1),$f01(a0)
; move.b 13(a1),$d01(a0)
;
; lea.l $bfd000,a0
; lea.l CIAB,a1
; clr.b $e00(a0)
; clr.b $f00(a0)
; move.b (a1),(a0)
; move.b 1(a1),$100(a0)
; move.b 2(a1),$200(a0)
; move.b 3(a1),$300(a0)
; move.b 4(a1),$400(a0)
; move.b 5(a1),$500(a0)
; move.b 6(a1),$600(a0)
; move.b 7(a1),$700(a0)
; move.b 8(a1),$800(a0)
; move.b 9(a1),$900(a0)
; move.b 10(a1),$a00(a0)
; move.b 11(a1),$b00(a0)
; move.b 12(a1),$c00(a0)
; move.b 14(a1),$e00(a0)
; move.b 15(a1),$f00(a0)
; move.b 13(a1),$d00(a0)
movem.l (a7)+,a0-a1
rts
***********************************************************
; update status line (at bottom of screen)
print_status: movem.l d0-d3/a0,-(a7)
lea.l insert_off_txt,a0
tst.b insert_mode
beq.b .ok_ins_off
lea.l insert_on_txt,a0
.ok_ins_off moveq #76,d0
move.w screen_height,d1
subq.w #1,d1
moveq #3-1,d3
.loop move.b (a0)+,d2
bsr print_char2
addq.w #1,d0
dbf d3,.loop
lea.l start(pc),a0
move.l a0,d0
lea.l watch_txt,a0
moveq #8,d1
bsr conv_hex
move.w screen_height,d1
subq.w #1,d1
moveq #47,d0
moveq #8-1,d3
.loop2 move.b (a0)+,d2
bsr print_char2
addq.w #1,d0
dbf d3,.loop2
movem.l (a7)+,d0-d3/a0
rts
***********************************************************
super move.w #$2000,sr ;enable interrupts
cmp.b #1,config_screen
bne.b .nontsc
move.w #0,$1dc(a6) ;NTSC mode 15Khz
bra.b .okscreen
.nontsc move.w #$20,$1dc(a6) ;PAL mode 15Khz
.okscreen
jsr read_palette
bsr clear_break
sf no_kill ;kill AR on exit
move.l vbr_reg,a4
move.l illegal_except,d0 ;restore vector used
beq.b no_illegal_init ;by breakpoint
move.l d0,$10(a4)
no_illegal_init
bsr set_pic ;init display area
moveq #0,d0
lea.l $140(a6),a0
moveq #$16-1,d1
clr_spr move.l d0,(a0)+ ;clear sprites data
dbf d1,clr_spr
bsr print_page
tst.b trace_moni ;in tracer ?
bne.b no_print_trace
bsr check_debug ;print debug entry message
tst.b BP_reach ;entered from BreakPoint ?
beq.b no_BP_enter
move.l Break_Address,d0
moveq #8,d1
lea.l BP_enter_txt,a0
bsr print_curs
bsr print_hexCR
no_BP_enter
tst.b BPJ_reach ;entered from JSR BP ?
beq.b no_BPJ_enter
move.l Break_Address,d0
moveq #8,d1
lea.l BPJ_enter_txt,a0
bsr print_curs
bsr print_hexCR
no_BPJ_enter
bsr clear_cursor
clr.w cursor_x
bsr print_reg ;print CPU registers
move.l pc_reg,dis_ptr
bsr single_inst ;disassemble 1 instr. at PC
no_print_trace
sf escape
tst.b BPatPC
beq.b .noPC
st escape
.noPC
sf p_used ;clr signal to allow sp command
bsr force_change ;force floppy disk change
;.joy move.w #0,$dff106
; move.w #$f,$dff180
; btst #7,$bfe001
; bne.b .joy
.raster move.l $4(a6),d0
lsr.l #1,d0
lsr.w #7,d0
cmp.w #$f0,d0
blt.b .raster
move.b #$7f,key_prev
tst.b config_IDE
beq.b .noIDEirq
move.l ide_irq(pc),d0
beq.b .noIDEirq
move.l d0,a3
tst.b (a3)
bpl.b .noIDEirq
move.l ide_base(pc),a3
jsr wait_irq ;remove IRQ request from IDE
.noIDEirq
bsr print_status
move.w #$7fff,$9c(a6) ;disable all INTREQ
move.w #$8300,$96(a6) ;bitplan DMA on
move.w #$c028,$9a(a6) ;VBL+CIAA IRQ on
moveq #2-1,d0
.loopk sf VBL
.waitk tst.b VBL ;wait to flush keyboard
beq.b .waitk ;buffer
dbf d0,.loopk
clr.w nb_keys
;-------------- Main Loop ---------------------------------
wait tst.w nb_keys
bne.b .go_fast
stop #$2000
.go_fast
;-------------- handle repeat key --------------------
move.w #$2700,sr
move.b key_prev,d0
move.w nb_keys,d1 ;key in buffer ?
beq.b .no_key
subq.w #1,nb_keys
subq.w #1,d1
lea.l key_buffer,a0
move.b (a0),d0
.copy move.b 1(a0),(a0)+ ;remove one key from buffer
dbf d1,.copy
.no_key move.w #$2000,sr
move.b d0,d1
cmp.b key_prev,d0
beq.b same_key
moveq #0,d2
move.b config_delay,d2
move.w d2,time_repeat
bra.b ok_same_key
same_key
tst.w time_repeat
bmi.w ok_same_key
move.b #$7f,d0
ok_same_key move.b d1,key_prev
move.b d0,key
;-------------- main stuff ---------------------------
bsr special_keys
tst.b trace_moni ;tracer on ?
beq.b .go_key
bsr.w do_tracer
bra.b .no_key
.go_key bsr normal_keys
.no_key tst.b escape ;quit AR ?
beq.w wait
;-------------- exit ---------------------------------
out_mon st tracer_refresh
move.w #$2700,sr
move.w #$7fff,$9a(a6)
move.w #$7fff,$96(a6)
move.w #$7fff,$9c(a6)
tst.b trace_moni
bne.b .noclr
bsr clear_cursor
.noclr
bsr remove_pic
jsr restore_palette
bsr init_break ;set breakpoints
move.w drive,-(a7)
moveq #3,d4 ;first drive SEL (drive0)
lea.l drive_present,a3
moveq #4-1,d5 ;4 drives
.loopd tst.b (a3)+
beq.b .nodrive
move.w d4,drive ;restore
bsr rest_head ;floppy drive head pos
.nodrive addq.w #1,d4
dbf d5,.loopd
move.w (a7)+,drive
rts
*******************************************************
;------------------------------------------------
;-------------- get a key from keyboard ---------
;-------------- used for confirmation y/n -------
;<- d0=key (ascII)
get_key clr.w nb_keys
.wait tst.w nb_keys
beq.b .wait
tst.b key_buffer ;key released ?
bmi.b get_key
move.w #$2700,sr
clr.w nb_keys
moveq #0,d0
move.b key_buffer,d0
move.b #$7f,key_prev
move.w #$2000,sr
move.l a0,-(a7)
move.l board_ptr,a0
move.b (a0,d0.w),d0
move.l (a7)+,a0
rts
*******************************************************
;-------------- Tracer --------------------------------
do_tracer movem.l d0-d7/a0-a6,-(a7)
tst.b tracer_refresh
beq.w .no_ref
sf tracer_refresh
clr.l cursor_x
bsr print_reg
lea.l empty_txt,a0
bsr print
lea.l tracer_addr,a3
move.l pc_reg,a4
moveq #5,d6 ;no of actual line
move.w screen_height,d0
sub.w #11,d0
.seek cmp.l (a3)+,a4
beq.b .found
addq.l #1,d6
dbf d0,.seek
moveq #5,d6
lea.l tracer_addr,a3
move.w screen_height,d7
sub.w #11,d7
.loop move.l a4,(a3)+
move.l a4,-(a7)
bsr corr_addr
lea.l general_txt,a0
moveq #7,d0 ;upper case, d $address,indir. address
jsr disassemble
move.l (a7)+,a4
add.w d0,a4
lea.l general_txt,a0
bsr print
dbf d7,.loop
.found
movem.w d0-d1,-(a7)
movem.w actual_pos,d0-d1
tst.w d0
bmi.b .no
move.b #' ',d2
bsr print_char ;clear old '>'
.no movem.w (a7)+,d0-d1
moveq #11,d0
move.l d6,d1
movem.w d0-d1,actual_pos
move.b #'>',d2
bsr print_char
.no_ref
lea.l key,a0
cmp.b #$7f,d0
beq.w .nok
cmp.b #$4e,d0
bne.b .nor
move.b #$7f,(a0)
move.w #1,trace_count
st escape
st tracer_refresh
.nor cmp.b #$4d,d0
bne.b .nodown
move.b #$7f,(a0)
movem.w actual_pos,d0-d1
move.l ascII_ptr,a1
mulu #80,d1
add.l d1,a1
cmp.b #'J',1(a1,d0.w)
bne.b .no_jsr
cmp.b #'S',2(a1,d0.w)
bne.b .no_jsr
cmp.b #'R',3(a1,d0.w)
beq.b .go_bsr
.no_jsr
cmp.b #'B',1(a1,d0.w)
bne.b .no_bsr
cmp.b #'S',2(a1,d0.w)
bne.b .no_bsr
cmp.b #'R',3(a1,d0.w)
bne.b .no_bsr
.go_bsr st trace_bsr
.no_bsr move.w #1,trace_count
st escape
st tracer_refresh
.nodown
.nok
movem.l (a7)+,d0-d7/a0-a6
rts
empty_txt dcb.b 79," "
dc.b $a,0
even
*******************************************************
;-------------- restore low-mem area used by display --
remove_pic tst.b pic_status
beq.b .okpic
sf pic_status
move.w #$2700,sr
st no_print
movem.l d0/a0-a1,-(a7)
moveq #0,d0
move.w d0,$dff106
move.l d0,$dff180
lea.l $0.w,a0
lea.l backup_pic,a1
move.w #LOSIZE/4-1,d0
.copy move.l (a1)+,(a0)+
dbf d0,.copy
movem.l (a7)+,d0/a0-a1
.okpic rts
;-------------- save low-mem area and print pic -------
set_pic tst.b pic_status
bne.b .okpic
st pic_status
movem.l d0/a0-a1,-(a7)
lea.l $0.w,a0
lea.l backup_pic,a1
move.w #LOSIZE/4-1,d0
.copy move.l (a0)+,(a1)+
dbf d0,.copy
movem.l (a7)+,d0/a0-a1
sf no_print
bsr print_page
move.w #$2000,sr
.okpic rts
***********************************************************
;-------------- jmp here when a keyboard reset-warn code --
;-------------- has been received -------------------------
go_reset move.w #$2700,sr
clr.l inited
sf entered
move.l $f80004,a0
subq.l #2,a0
move.w #0,$dff100
move.w #0,$dff1dc
jmp (a0)
***********************************************************
;-------------- VBL interrupt handler ---------------------
newirq movem.l d0-d7/a0-a6,-(a7)
lea.l $dff000,a6
st VBL ;signal a VBL
;-------------- init display registers ----------
move.l pic_ptr(pc),d0
cmp.b #1,config_screen
bne.b .nontsc
move.l #$90010000,$100(a6)
move.l #$3081f7c1,$8e(a6)
move.w #$0,$1dc(a6)
tst.b small_pic
beq.b .gofull
add.l #(22-3)*80*h,d0
move.l #$dc81f7c1,$8e(a6)
; move.w #$2101,$1e4(a6)
.gofull move.l d0,$e0(a6)
move.w #$0c00,$106(a6)
move.w #$0000,$10c(a6)
move.l #$eee,$180(a6)
move.l #$003c00d4,$92(a6)
move.w #0,$108(a6)
move.w #0,$1fc(a6)
bra.w .okmode
.nontsc cmp.b #2,config_screen
bne.w .nomulti
tst.b small_pic
beq.b .gofull2
add.l #(52-3)*80*h,d0
.gofull2 move.l d0,$e0(a6)
move.l #$2c4500e5,$8e(a6)
move.l #$00200068,$92(a6)
move.w #$1b88,$1dc(a6)
move.w #$1241,$100(a6)
move.w #0,$108(a6)
move.w #-80,$10a(a6)
move.w #$0000,$1fc(a6)
move.w #$0071,$1c0(a6)
move.w #$0008,$1c4(a6)
move.w #$000e,$1de(a6)
move.w #$001c,$1c2(a6)
move.w #$001e,$1c6(a6)
move.w #$0046,$1e2(a6)
move.w #$020c,$1c8(a6)
move.w #$0000,$1cc(a6)
move.w #$0003,$1e0(a6)
move.w #$0200,$1e4(a6)
move.w #$0005,$1ca(a6)
move.w #$001d,$1ce(a6)
move.w #$0012,$104(a6)
move.w #$0c21,$106(a6)
move.l #$eee,$180(a6)
bra.b .okmode
.nomulti
move.l #$90010000,$100(a6)
move.l #$30812cc1,$8e(a6)
move.w #$20,$1dc(a6)
tst.b small_pic
beq.b .gofull3
add.l #(28-3)*80*h,d0
move.l #$11812cc1,$8e(a6)
move.w #$2101,$1e4(a6)
.gofull3 move.l d0,$e0(a6)
move.w #$0c00,$106(a6)
move.w #$0000,$10c(a6)
move.l #$eee,$180(a6)
move.l #$003c00d4,$92(a6)
move.w #0,$108(a6)
move.w #0,$1fc(a6)
.okmode
tst.b trace_moni ;test if in Tracer
bne.b .no_cur
bsr do_cursor
.no_cur
tst.w time_repeat
bmi.b no_sub_repeat
subq.w #1,time_repeat ;for repeat key
no_sub_repeat
bsr do_watch
move.w #$20,$9c(a6) ;interrupt ACK
movem.l (a7)+,d0-d7/a0-a6
rte
; IRQ handler of CIA-A (keyboard)
newirq2 movem.l d0-d1/a0/a1/a5-a6,-(a7)
lea.l $dff000,a6
tst.b config_IDE
beq.b .noide
move.l ide_irq(pc),d0
beq.b .noide
move.l d0,a0
move.b (a0),d0 ;interrupt from IDE ?
bpl.b .noide
tst.b config_A1200
bne.b .go1200
move.l ide_base(pc),a1
move.w ide_status,d0
move.b (a1,d0.w),d0
st IDE_IRQ
bra.b .noide
.go1200 move.w SR,-(a7)
move.w #$2700,sr
move.l ide_base(pc),a1
move.w ide_status,d0
move.b (a1,d0.w),d0
move.b (a0),d0
andi.b #3,d0
or.b #$7c,d0
move.b d0,(a0)
st IDE_IRQ
move.w (a7)+,SR
.noide
move.b $bfed01,d0
btst #3,d0 ;test if interrupt from keyboard
beq.b .pas_key
move.b $bfec01,d0 ;get key
not.b d0
ror.b #1,d0
cmp.b #$78,d0
beq.w go_reset
cmp.b #$45,d0
bne.b .no_break
st break
.no_break
tst.b new_key ;test if waiting for key-pressed
bne.b .no_buf
cmp.w #64-1,nb_keys
beq.b .pas_key
lea.l key_buffer,a0
move.w nb_keys,d1
move.b d0,(a0,d1.w) ;save key in key buffer
addq.w #1,nb_keys
.no_buf btst #7,d0
bne.b .nonew
sf new_key
.nonew bset #6,$bfee01
moveq #3-1,d1
.wait move.b 6(a6),d0 ;wait 3 raster lines
.ras cmp.b 6(a6),d0
beq.b .ras
dbf d1,.wait
bclr #6,$bfee01
.pas_key move.w #$8,$9c(a6) ;interrupt ACK
movem.l (a7)+,d0-d1/a0/a1/a5-a6
rte
********************************************************************
;------------- Display the actual address of a search process ------
;------------- at the bottom of the screen -------------------------
do_watch movem.l d0-d3/a0-a1,-(a7)
lea.l watch_txt,a0
moveq #8,d1
move.l watch,d0
bsr conv_hex
lea.l watch_txt,a0
moveq #31,d0
move.w screen_height,d1
subq.w #1,d1
moveq #8-1,d3
.print move.b (a0)+,d2
bsr print_char2
addq.w #1,d0
dbf d3,.print
move.w drive,d2
add.b #'0'-3,d2
moveq #18,d0
move.w screen_height,d1
subq.w #1,d1
bsr print_char2
lea.l track,a1
move.w drive,d0
move.w -3*2(a1,d0.w*2),d0
lea.l watch_txt,a0
lsr.w #1,d0
moveq #0,d1
move.b #128+2,d1
bsr conv_dec
moveq #7,d0
move.w screen_height,d1
subq.w #1,d1
moveq #2-1,d3
lea.l watch_txt+1,a0
.print2 move.b (a0)+,d2
bsr print_char2
addq.w #1,d0
dbf d3,.print2
movem.l (a7)+,d0-d3/a0-a1
rts
*******************************************************
;print ascII page
print_page movem.l d0-d1,-(a7)
moveq #0,d0
move.w screen_height,d1
subq.w #1,d1
next_page_all bsr print_line
addq.w #1,d0
dbf d1,next_page_all
movem.l (a7)+,d0-d1
rts
************************************************************
;-------------- handle all special keys --------------------
;-------------- shift,backspace,F1-F10,etc... --------------
special_keys lea.l key,a0
move.b (a0),d0
cmp.b #$7f,d0
beq.w no_special_keys
cmp.b #$60,d0
blt.b no_shift_on
cmp.b #$62,d0
bgt.b no_shift_on
st shift_mode
move.b #$7f,(a0)
no_shift_on cmp.b #$60+$80,d0
blt.b no_shift_off
cmp.b #$62+$80,d0
bgt.b no_shift_off
sf shift_mode
move.b #$7f,(a0)
no_shift_off
cmp.b #$63,d0
bne.b .no_ctrl_on
st ctrl_mode
move.b #$7f,(a0)
.no_ctrl_on
cmp.b #$63+$80,d0
bne.b .no_ctrl_off
sf ctrl_mode
move.b #$7f,(a0)
.no_ctrl_off
cmp.b #$64,d0
beq.b .alt_on
cmp.b #$65,d0
bne.b .no_alt_on
.alt_on st alt_mode
move.b #$7f,(a0)
.no_alt_on
cmp.b #$64+$80,d0
beq.b .alt_off
cmp.b #$65+$80,d0
bne.b .no_alt_off
.alt_off sf alt_mode
move.b #$7f,(a0)
.no_alt_off
cmp.b #$66,d0
beq.b .amiga_on
cmp.b #$67,d0
bne.b .no_amiga_on
.amiga_on st amiga_mode
move.b #$7f,(a0)
.no_amiga_on
cmp.b #$66+$80,d0
beq.b .amiga_off
cmp.b #$67+$80,d0
bne.b .no_amiga_off
.amiga_off sf amiga_mode
move.b #$7f,(a0)
.no_amiga_off
tst.b d0
bmi.w no_special_keys
lea.l cursor_x,a3
tst.b trace_moni
bne.w no_speck1
cmp.b #$45,d0
bne.b no_esc
move.b #$7f,(a0)
no_esc
;-------------- Return -------------------------------
cmp.b #$43,d0
beq.b ok_return
cmp.b #$44,d0
bne.b no_cr
ok_return bsr clear_cursor
clr.w (a3)
move.b #$7f,(a0)
clr.w (a3)
move.w window_bot,d1
cmp.w 2(a3),d1
bgt.b ok_do_cr
bsr scroll_up
subq.w #1,2(a3)
ok_do_cr addq.w #1,2(a3)
bsr command_line
bsr set_cursor
no_cr
;-------------- arrow keys --------------------------
cmp.b #$4f,d0
bne.b no_left
move.b #$7f,(a0)
bsr clear_cursor
tst.b shift_mode
beq.b .no_sh
clr.w (a3)
bra.b .ok_sh
.no_sh tst.w (a3)
bne.b .ok_left_edge
move.w #80,(a3) ;-1 -> 79
tst.w 2(a3)
bne.b .ok_top_edge
addq.w #1,2(a3) ;keep 0 coz -1 later
bsr scroll_down
.ok_top_edge subq.w #1,2(a3)
.ok_left_edge subq.w #1,(a3)
.ok_sh bsr set_cursor
no_left cmp.b #$4e,d0
bne.b no_right
move.b #$7f,(a0)
bsr clear_cursor
tst.b shift_mode
beq.b .no_sh
move.w #79,(a3)
bra.b .ok_sh
.no_sh cmp.w #79,(a3)
blt.b .ok_right_edge
move.w #-1,(a3)
move.w window_bot,d1
cmp.w 2(a3),d1
bgt.b .ok_bot_edge
subq.w #1,2(a3) ;keep 24 coz +1 later
bsr scroll_up
.ok_bot_edge addq.w #1,2(a3)
.ok_right_edge addq.w #1,(a3)
.ok_sh bsr set_cursor
no_right
cmp.b #$4c,d0
bne.w no_up
move.b #$7f,(a0)
bsr clear_cursor
tst.b shift_mode
beq.b .noshift
move.w (2,a3),d1
clr.w (2,a3) ;move cursor to top of screen
tst.w d1
beq.b .no_ctrl
bra.w .end_up
.noshift tst.b ctrl_mode
beq.b .no_ctrl
movem.l d0/a0,-(a7)
clr.w (a3)
moveq #16-1,d1 ;nb history lines
.loop subq.w #1,history_disp
and.w #$f,history_disp
move.w history_disp,d0
mulu #80,d0
lea.l history,a0
add.l d0,a0
tst.b (a0)
dbne d1,.loop
bsr print
lea.l 79(a0),a0
.back cmp.b #' ',-(a0)
bne.b .no_spc
subq.w #1,(a3)
bra.b .back
.no_spc movem.l (a7)+,d0/a0
bra.b .end_up
.no_ctrl tst.w 2(a3)
bne.b .ok_up
moveq #1,d2 ;scroll 1 line
tst.b shift_mode
beq.b .no_sh2
clr.w (a3)
moveq #SC_STEP,d2
.no_sh2 movem.l d0-a4,-(a7)
move.l last_cmd,a0
tst.l (12,a0)
sne no_sc_clr
bsr scroll_down2
move.l (12,a0),d0
beq.b .no_up_cmd
jsr (d0.l)
beq.b .no_up_cmd
bsr print_page
.no_up_cmd movem.l (a7)+,d0-a4
bra.b .end_up
.ok_up subq.w #1,2(a3)
.end_up bsr set_cursor
no_up
cmp.b #$4d,d0
bne.w no_down
move.b #$7f,(a0)
bsr clear_cursor
tst.b shift_mode
beq.b .noshift
move.w (2,a3),d1
move.w window_bot,(2,a3) ;move cursor to bot. of screen
cmp.w window_bot,d1
beq.b .no_ctrl
bra.w .end_down
.noshift tst.b ctrl_mode
beq.b .no_ctrl
movem.l d0/a0,-(a7)
clr.w (a3)
moveq #16-1,d1
.loop addq.w #1,history_disp
and.w #$f,history_disp
move.w history_disp,d0
mulu #80,d0
lea.l history,a0
add.l d0,a0
tst.b (a0)
dbne d1,.loop
bsr print
lea.l 79(a0),a0
.back cmp.b #' ',-(a0)
bne.b .no_spc
subq.w #1,(a3)
bra.b .back
.no_spc movem.l (a7)+,d0/a0
bra.b .end_down
.no_ctrl move.w window_bot,d1
cmp.w 2(a3),d1
bgt.b .ok_down
moveq #1,d2 ;scroll 1 line
tst.b shift_mode
beq.b .no_sh2
clr.w (a3)
moveq #SC_STEP,d2
.no_sh2 movem.l d0-a4,-(a7)
move.l last_cmd,a0
tst.l (16,a0)
sne no_sc_clr
bsr scroll_up2
move.l (16,a0),d0
beq.b .no_down_cmd
jsr (d0.l)
beq.b .no_down_cmd
bsr print_page
.no_down_cmd movem.l (a7)+,d0-a4
bra.b .end_down
.ok_down addq.w #1,2(a3)
.end_down bsr set_cursor
no_down
;-------------- switch Tracer page ON/OFF F7 --------------
no_speck1 cmp.b #$56,d0
bne.b .no_f7
move.b #$7f,(a0)
not.b trace_moni
beq.b .quittracer
bsr clear_cursor
move.l #ascII_Tracer,d1
move.w #MAX_SCREEN,d2
sub.w screen_height,d2
mulu #80,d2
add.l d2,d1
move.l d1,ascII_ptr
bsr print_page
st trace_moni
move.l cursor_x,old_cursor
st tracer_refresh
bra.b .endF7
.quittracer bsr clear_cursor
move.l old_cursor,cursor_x
lea.l ascII_ptr,a1
movem.l 4(a1),d0-d1 ;read ascII_page1,2 ptrs
tst.b ascII_page ;flip page flag
bne.b .noex2
exg d0,d1
.noex2 move.l d1,(a1) ;set actual page ptr
bsr print_page
bsr set_cursor
.endF7
;-------------- switch page 1/2 F10 -----------------------
.no_f7
cmp.b #$59,d0
bne.b no_f10
move.b #$7f,(a0)
tst.b trace_moni
bne.b no_f10
bsr clear_cursor
lea.l ascII_ptr,a1
movem.l 4(a1),d1-d2 ;read ascII_page1,2 ptrs
not.b ascII_page ;flip page flag
bne.b .noex
exg d1,d2
.noex move.l d2,(a1) ;set actual page ptr
bsr print_page
bsr set_cursor
no_f10
;-------------- Clear screen F1 -----------------
tst.b trace_moni
bne.w no_speck2
cmp.b #$50,d0
bne.b no_f1
move.b #$7f,(a0)
bsr clear_cursor
move.l ascII_ptr,a1
move.w window_top,d2
mulu #80,d2
add.l d2,a1
move.l #' ',d1
move.w window_bot,d2
sub.w window_top,d2
addq.w #1,d2
mulu #20,d2
subq.w #1,d2
clear_ascII move.l d1,(a1)+
dbf d2,clear_ascII
bsr print_page
moveq #0,d1
move.w window_top,d1
move.l d1,cursor_x
bsr set_cursor
no_f1
;-------------- change insert mode F2 -----------
cmp.b #$51,d0
bne.b no_f2
move.b #$7f,(a0)
movem.l d0/a0,-(a7)
lea.l insert_off_txt,a0
not.b insert_mode
beq.b ok_ins_off
lea.l insert_on_txt,a0
ok_ins_off moveq #76,d0
move.w screen_height,d1
subq.w #1,d1
moveq #3-1,d3
.loop move.b (a0)+,d2
bsr print_char2
addq.w #1,d0
dbf d3,.loop
movem.l (a7)+,d0/a0
no_f2
;-------------- change FCPU F6 ------------------
cmp.b #$55,d0
bne.b .no_f5
move.b #$7f,(a0)
tst.b fami_mode
beq.b .was802
bsr set_65802
bra.b .no_f5
.was802 bsr set_65816
.no_f5
;-------------- backspace -----------------------
cmp.b #$41,d0
bne.w no_back
move.b #$7f,(a0)
tst.b shift_mode ;shift+backspace -> clear line
beq.b .no_clr
bsr clear_cursor
move.w d0,-(a7)
move.l ascII_ptr,a1
move.w 2(a3),d0
mulu #80,d0
add.l d0,a1
moveq #80-1,d0
.fill move.b #' ',(a1)+
dbf d0,.fill
clr.w (a3)
move.w 2(a3),d0
bsr print_line
move.w (a7)+,d0
bsr set_cursor
bra.b no_back
.no_clr tst.w (a3)
beq.b no_back
bsr clear_cursor
move.l ascII_ptr,a1
add.w (a3),a1 ;add x cursor
subq.w #1,a1
move.w 2(a3),d1
mulu #80,d1
add.l d1,a1 ;add y cursor
lea.l 1(a1),a2
moveq #80-1,d1
sub.w (a3),d1
scroll_line move.b (a2)+,(a1)+
dbf d1,scroll_line
move.b #' ',(a1)+
move.w d0,-(a7)
move.w 2(a3),d0
bsr print_line
move.w (a7)+,d0
subq.w #1,(a3)
bsr set_cursor
no_back
;-------------- del -----------------------------
cmp.b #$46,d0
bne.b no_del
move.b #$7f,(a0)
bsr clear_cursor
tst.b shift_mode
beq.b .do_del
move.l ascII_ptr,a1
move.w 2(a3),d1
mulu #80,d1
add.l d1,a1
lea.l 80(a1),a1
lea.l -1(a1),a2
moveq #80-2,d1
sub.w (a3),d1
bmi.b end_del
.l move.b -(a2),-(a1)
dbf d1,.l
move.b #' ',(a2)
bra.b end_del
.do_del move.l ascII_ptr,a1
add.w (a3),a1 ;add x cursor
move.w 2(a3),d1
mulu #80,d1
add.l d1,a1 ;add y cursor
lea.l 1(a1),a2
moveq #80-1,d1
sub.w (a3),d1
bra.b do_dbf_scroll
scroll_line2 move.b (a2)+,(a1)+
do_dbf_scroll dbf d1,scroll_line2
move.b #' ',(a1)+
end_del move.w d0,-(a7)
move.w 2(a3),d0
bsr print_line
move.w (a7)+,d0
bsr set_cursor
no_del
;-------------- HELP print help page ---------------
cmp.b #$5f,d0
bne.b no_help
move.b #$7f,(a0)
move.l a0,-(a7)
lea.l help_txt,a0
bsr print_curs
tst.b break
beq.b .nobrk
sf break
lea.l break_txt,a0
bsr print
.nobrk move.l (a7)+,a0
no_help
no_speck2
no_special_keys rts
;------------------------------------------------
;-------------- handle normal keys --------------
;-------------- 0-9,a-z,etc... ------------------
normal_keys lea.l key,a0
tst.b snap_buf
beq.b .nos
move.b #$40,(a0)
.nos moveq #0,d0
move.b (a0),d0
cmp.b #$7f,d0
beq.w no_normal_keys
move.b #$7f,(a0)
tst.b d0
bmi.w no_normal_keys
bsr clear_cursor
move.l board_ptr,a1
tst.b shift_mode
beq.b no_shift_mode
move.l board_ptr+4,a1
no_shift_mode tst.b alt_mode
beq.b .no_alt
move.l board_ptr+8,a1
.no_alt move.b (a1,d0.w),d2
move.l a0,-(a7)
lea.l snap_buf,a0
tst.b (a0)
beq.b empty_snap
resnap move.b (a0)+,d2
empty_snap lea.l cursor_x,a3
tst.b insert_mode
beq.b no_insert_mode
;-------------- do insert mode -----------------
cmp.w #79,(a3)
bge.b ok_cursor_pos
move.l ascII_ptr,a1
move.l a1,a2
add.w (a3),a1
move.w 2(a3),d0
mulu #80,d0
add.l d0,a1
add.l d0,a2
lea.l 80(a2),a2
lea.l -1(a2),a4
do_insert move.b -(a4),-(a2)
cmp.l a1,a4
bne.b do_insert
move.b d2,(a1)
addq.w #1,(a3)
move.w 2(a3),d0
bsr print_line
bra.b ok_cursor_pos
;-----------------------------------------------
no_insert_mode
movem.w (a3),d0-d1
bsr print_char
addq.w #1,(a3)
cmp.w #80,(a3)
blt.b ok_cursor_pos
clr.w (a3)
move.w window_bot,d1
cmp.w 2(a3),d1
bgt.b ok_cursor_h
bsr scroll_up
bra.b ok_cursor_pos
ok_cursor_h addq.w #1,2(a3)
ok_cursor_pos
tst.b (a0)
bne.w resnap
sf snap_buf
move.l (a7)+,a0
bsr set_cursor
no_normal_keys rts
************************************************************
;-------------- called when RETURN is pressed --------------
command_line movem.l d0-d7/a0-a4,-(a7)
lea.l cursor_x,a3
move.w 2(a3),d0 ;read y pos
subq.w #1,d0
move.l ascII_ptr,a0
mulu #80,d0
add.l d0,a0
lea.l command,a1
moveq #80-1,d1
copy_command move.b (a0)+,(a1)+ ;copy current line into
dbf d1,copy_command ;command
sf d4 ;command repeat signal off
lea.l command,a0
seek_command move.b (a0)+,d0 ;seek command first char
beq.b end_cmd_line
cmp.b #$20,d0
beq.b seek_command
bra.b ok_new_cmd
end_cmd_line subq.w #1,2(a3) ;if command line is empty
move.l last_cmd,a0 ;then repeat last command
addq.l #1,a0
st d4 ;signal in d4 for cmd repeat
ok_new_cmd
subq.l #1,a0
lea.l cmd_list,a2
moveq #0,d1 ;command code offset cleared
.loop2 tst.b (a2) ;search if command
beq.b end_cmd_list ;exists
move.l a2,a3
move.l a0,a1
.loop move.b (a3)+,d3
beq.b .ok_cmp
move.b (a1)+,d0
bsr upper_case
cmp.b d0,d3
beq.b .loop
.go1 lea.l 20(a2),a2 ;next command in cmd_list
bra.b .loop2
.ok_cmp move.l 8(a2),d1 ;command code offset
cmp.l #cmd_x,d1
beq.b .nolast ;cant't repeat cmd_x
move.l a2,last_cmd
.nolast move.l a1,d2
bra.b .go1 ;check if it's really this cmd
;to get the longest cmd.
end_cmd_list sf break
tst.l d1
beq.b no_command
tst.b d4 ;test if cmd repeat ?
bne.b .no_hist
lea.l history_cnt,a2
move.w (a2),d0
lea.l history,a0
mulu #80,d0
add.l d0,a0
lea.l command,a1
moveq #79-1,d0
.copy move.b (a1)+,(a0)+ ;copy command in history
dbf d0,.copy
addq.w #1,(a2)
and.w #$f,(a2) ;maxi 16 history lines
move.w (a2),history_disp
.no_hist st no_curs
move.l d2,a0
lea.l cmd_list(pc),a5
jmp (d1.l) ;execute the command
no_command lea.l unknown_txt,a0
bsr print
end_command
tst.b break ;ESC pressed during
beq.b .no_break ;command ?
sf break
lea.l break_txt,a0
bsr print
.no_break
sf no_curs
movem.l (a7)+,d0-d7/a0-a4
rts
************************************************************
cnop 0,4
;-------------- cmds ordered by size -----------------------
;cmd format
;----------
;dc.b cmd name padded with 0 (8 bytes)
;dc.l ptr to code, ptr to line up code, ptr to line down code
cmd_list: dc.b 'R',0,0,0,0,0,0,0
dc.l cmd_r,0,0
dc.b 'H',0,0,0,0,0,0,0
dc.l cmd_h,cmdu_h,cmdd_h
dc.b 'M',0,0,0,0,0,0,0
dc.l cmd_h,cmdu_h,cmdd_h
dc.b 'D',0,0,0,0,0,0,0
dc.l cmd_a,cmdu_d,cmdd_d
dc.b 'B',0,0,0,0,0,0,0
dc.l cmd_b,0,0
dc.b 'C',0,0,0,0,0,0,0
dc.l cmd_c,0,0
dc.b 'T',0,0,0,0,0,0,0
dc.l cmd_t,0,0
dc.b 'N',0,0,0,0,0,0,0
dc.l cmd_n,cmdu_n,cmdd_n
dc.b 'P',0,0,0,0,0,0,0
dc.l cmd_p,0,0
dc.b '?',0,0,0,0,0,0,0
dc.l cmd_ev,0,0
dc.b 'L',0,0,0,0,0,0,0
dc.l cmd_l,0,0
dc.b 'X',0,0,0,0,0,0,0
dc.l cmd_x,0,0
dc.b 'G',0,0,0,0,0,0,0
dc.l cmd_g,0,0
dc.b 'F',0,0,0,0,0,0,0
dc.l cmd_f,0,0
dc.b 'O',0,0,0,0,0,0,0
dc.l cmd_o,0,0
dc.b 'A',0,0,0,0,0,0,0
dc.l cmd_a,0,0
dc.b 'S',0,0,0,0,0,0,0
dc.l cmd_s,0,0
dc.b 'Q',0,0,0,0,0,0,0
dc.l cmd_q,0,0
dc.b 'E',0,0,0,0,0,0,0
dc.l cmd_e,cmdu_e,cmdd_e
dc.b 'FI',0,0,0,0,0,0
dc.l cmd_fi,0,0
dc.b 'RS',0,0,0,0,0,0
dc.l cmd_disk1,0,0
dc.b 'WS',0,0,0,0,0,0
dc.l cmd_disk2,0,0
dc.b 'CD',0,0,0,0,0,0
dc.l cmd_cd,0,0
dc.b 'DF',0,0,0,0,0,0
dc.l cmd_df,0,0
dc.b 'AF',0,0,0,0,0,0
dc.l cmd_af,0,0
dc.b 'TS',0,0,0,0,0,0
dc.l cmd_ts,0,0
dc.b 'TF',0,0,0,0,0,0
dc.l cmd_tf,0,0
dc.b 'SA',0,0,0,0,0,0
dc.l cmd_sa,0,0
dc.b 'LA',0,0,0,0,0,0
dc.l cmd_la,0,0
dc.b 'LS',0,0,0,0,0,0
dc.l cmd_dir,0,0
dc.b 'SP',0,0,0,0,0,0
dc.l cmd_sp,0,0
dc.b 'BB',0,0,0,0,0,0
dc.l cmd_bb,0,0
dc.b 'FS',0,0,0,0,0,0
dc.l cmd_fs,0,0
dc.b 'TSD',0,0,0,0,0
dc.l cmd_tsd,0,0
dc.b 'FIF',0,0,0,0,0
dc.l cmd_fif,0,0
dc.b 'DIR',0,0,0,0,0
dc.l cmd_dir,0,0
dc.b 'PAL',0,0,0,0,0
dc.l cmd_pal,0,0
dc.b '31K',0,0,0,0,0
dc.l cmd_31k,0,0
dc.b 'LED',0,0,0,0,0
dc.l cmd_led,0,0
dc.b 'IDE',0,0,0,0,0
dc.l cmd_ide,0,0
dc.b 'DEL',0,0,0,0,0
dc.l cmd_del,0,0
dc.b 'PWD',0,0,0,0,0
dc.l cmd_cd,0,0
dc.b 'D2F',0,0,0,0,0
dc.l cmd_d2f,0,0
dc.b 'F2D',0,0,0,0,0
dc.l cmd_f2d,0,0
dc.b 'VER',0,0,0,0,0
dc.l cmd_ver,0,0
dc.b 'SAC',0,0,0,0,0
dc.l cmd_sac,0,0
dc.b 'COP',0,0,0,0,0
dc.l cmd_cop,0,0
dc.b 'NTSC',0,0,0,0
dc.l cmd_ntsc,0,0
dc.b 'TYPE',0,0,0,0
dc.l cmd_type,0,0
dc.b 'COPY',0,0,0,0
dc.l cmd_copy,0,0
dc.b 'PART',0,0,0,0
dc.l cmd_part,0,0
dc.b 'KILL',0,0,0,0
dc.l cmd_kill,0,0
dc.b 'DRIVE',0,0,0
dc.l cmd_drive,0,0
dc.b 'DEBUG',0,0,0
dc.l cmd_debug,0,0
dc.b 'MOTOR',0,0,0
dc.l cmd_motor,0,0
dc.b 'INTEL',0,0,0
dc.l cmd_intel,0,0
dc.b 'EXCEP',0,0,0
dc.l cmd_excep,0,0
dc.b 'MKDIR',0,0,0
dc.l cmd_makedir,0,0
dc.b 'CLEAR',0,0,0
dc.l cmd_clear,0,0
dc.b 'REBOOT',0,0
dc.l cmd_reboot,0,0
dc.b 'FORMAT',0,0
dc.l cmd_format,0,0
dc.b 'OUTPUT',0,0
dc.l cmd_output,0,0
dc.b 'SETMAP',0,0
dc.l cmd_setmap,0,0
dc.b 'HORNET',0,0
dc.l cmd_hornet,0,0
dc.b 'CHKDSK',0,0
dc.l cmd_diskchk,0,0
dc.b 'FORMATQ',0
dc.l cmd_formatq,0,0
dc.b 'DISKCHK',0
dc.l cmd_diskchk,0,0
dc.b 'MAKEDIR',0
dc.l cmd_makedir,0,0
dcb.b 8,0
dc.l 0,0,0
****************************************************************
cmd_ver lea.l ver_txt(pc),a0
bsr print
bra.w end_command
ver_txt dc.b "HRTmon v"
version ;x.yz
dc.b $a,0
even
****************************************************************
include src/copper.s
****************************************************************
;-------------- FS find string (not casesensitive) -------------
cmd_fs bsr evaluate
bne.w illegal_addr
move.l d0,find_start
bsr evaluate
bne.w illegal_addr
move.l d0,find_end
movem.l find_start,d0-d1
cmp.l d0,d1
ble.w illegal_addr
lea.l find_list,a1
bsr read_name
tst.b (a1)
beq.w illegal_string
.up move.b (a1),d0
beq.b .endlist
bsr upper_case
move.b d0,(a1)+
bra.b .up
.endlist
movem.l find_start,a0-a1
lea.l watch,a3
move.l a0,(a3)
.seek tst.b break
bne.w .endfs
lea.l find_list,a2
move.b (a2)+,d1
.next cmp.l a1,a0
bge.w .endfs
move.l a0,(a3)
move.l a0,a4
CORR_ADDR 1
move.b (a4),d0
addq.l #1,a0
bsr upper_case
cmp.b d0,d1
bne.b .next
move.l a0,d7
.ok move.b (a2)+,d1
beq.b .found
cmp.l a1,a0
bge.b .endfs
move.l a0,a4
CORR_ADDR 2
addq.l #1,a0
move.b (a4),d0
bsr upper_case
cmp.b d0,d1
beq.b .ok
move.l d7,a0
bra.b .seek
.found move.l d7,d0
subq.l #1,d0
lea.l ev_line,a0
move.w #$2020,8(a0)
clr.b 10(a0)
moveq #8,d1
bsr conv_hex
bsr print
move.l d7,a0
bra.w .seek
.endfs
tst.w cursor_x
beq.b .no_CR
lea.l cr_txt,a0
bsr print
.no_CR
bra.w end_command
****************************************************************
cmd_clear
lea.l sureclear_txt(pc),a0
bsr print
bsr get_key
lea.l sure2_txt(pc),a0
bsr print
cmp.b #'y',d0
bne.b .no
bsr remove_pic
lea.l $0.w,a0
moveq #0,d0
moveq #-1,d1
.clear rept 8
move.l d0,(a0)+
endr
dbf d1,.clear
bsr set_pic
move.l $f80004,a0
subq.l #2,a0
move.l a0,pc_reg
move.w #$2700,sr_reg
st escape
.no bra.w end_command
sureclear_txt dc.b "All memory will be cleared and the machine will reboot!",$a
dc.b "(You will have to reinstall HRTmon)",$a
dc.b "Are you sure you want to continue ? (y/n)",$d,0
sure2_txt dc.b " ",$d,0
even
****************************************************************
;-------------- SETMAP change keymap ----------------------
cmd_setmap lea.l ev_line,a1
bsr read_name
tst.b (a1) ;keymap name given ?
beq.w .noset
lea.l ev_line,a0
.up move.b (a0),d0
bsr upper_case
move.b d0,(a0)+ ;upper-case keymap name
tst.b (a0)
bne.b .up
lea.l ev_line,a0
cmp.l #"USA"*256,(a0)
bne.b .noUSAset
move.l #board3,d0
move.l #board4,d1
move.l #board4a,d2
bra.b .set
.noUSAset cmp.w #"CH",(a0)
bne.b .noCHset
tst.b 2(a0)
bne.b .noCHset
move.l #board1,d0
move.l #board2,d1
move.l #board2a,d2
bra.b .set
.noCHset cmp.w #"D"*256,(a0)
bne.b .noDset
move.l #board5,d0
move.l #board6,d1
move.l #board6a,d2
bra.b .set
.noDset cmp.w #"F"*256,(a0)
bne.b .noFset
move.l #board7,d0
move.l #board8,d1
move.l #board8a,d2
bra.b .set
.noFset
lea.l .maperr_txt(pc),a0
bsr print
bra.b .noset
.set movem.l d0-d2,board_ptr
.noset lea.l .key1_txt(pc),a0
bsr print
move.l board_ptr,d0
cmp.l #board3,d0
bne.b .noUSA
lea.l .key2_txt(pc),a0
.noUSA cmp.l #board1,d0
bne.b .noCH
lea.l .key3_txt(pc),a0
.noCH cmp.l #board5,d0
bne.b .noD
lea.l .key4_txt(pc),a0
.noD cmp.l #board7,d0
bne.b .noF
lea.l .key5_txt(pc),a0
.noF bsr print
bra.w end_command
.maperr_txt dc.b "Illegal keymap name !",$a,0
.key1_txt dc.b "Actual keymap is : ",0
.key2_txt dc.b "USA",$a,0
.key3_txt dc.b "CH",$a,0
.key4_txt dc.b "D",$a,0
.key5_txt dc.b "F",$a,0
even
;-------------- print exception vectors and names --------------
cmd_excep lea.l Vector_names,a4
move.l vbr_reg,a3
.loop move.w (a4)+,d2
bmi.b .end
lea.l .txt(pc),a0
bsr print
move.l (a3,d2.w),d0
cmp.l #start,d0
blt.b .ok
cmp.l #end,d0
bge.b .ok
move.l (d2.w),d0
.ok moveq #8,d1
bsr print_hex
move.l (a4)+,a0
bsr print
bra.b .loop
.end
bra.w end_command
.txt dc.b "$",0
even
;-------------- disk to file -----------------------------------
;-------------- read a whole disk and save it as a file --------
cmd_d2f
lea.l ev_line,a1
bsr read_name
tst.b (a1)
beq.w illegal_name
bsr test_present
bne.w .error
move.l #ev_line,d1
moveq #-1,d2 ;create new file
bsr open_file
move.l d0,d7
beq.b .error
move.w #-1,ts_size ;trainer buffer cleared
moveq #0,d5
move.w #160-1,d6
.next move.l #tmp_mem,a0
move.l d5,d0
moveq #11,d1
bsr read2
bne.b .error
add.l d1,d5
move.l d7,d1
move.l #tmp_mem,d2
move.l #512*11,d3
bsr write_file
bne.b .error
tst.b break
bne.b .close
dbf d6,.next
.close move.l d7,d1
bsr close_file
.error
bra.w end_disk
;-------------- file to disk -----------------------------------
;-------------- read a file and write it to disk ---------------
cmd_f2d lea.l ev_line,a1
bsr read_name
tst.b (a1)
beq.w illegal_name
bsr test_present
bne.w .error
move.l #ev_line,d1
moveq #0,d2 ;open old file
bsr open_file
move.l d0,d7
beq.w .error
move.l d7,a0
cmp.l #80*22*512,file_size(a0)
beq.b .oksize
lea.l sizeErr_txt(pc),a0
bsr print
bra.b .error
.oksize
move.w #-1,ts_size ;trainer buffer cleared
moveq #0,d5
move.w #160-1,d6
.next move.l d7,d1
move.l #tmp_mem,d2
move.l #512*11,d3
bsr read_file
bne.b .error
move.l #tmp_mem,a0
move.l d5,d0
moveq #11,d1
bsr write2
bne.b .error
add.l d1,d5
tst.b break
bne.b .close
dbf d6,.next
.close move.l d7,d1
bsr close_file
.error
bra.w end_disk
sizeErr_txt dc.b "Wrong file size !",$a,0
even
;-------------- show custom registers --------------------------
cmd_e bsr evaluate
bne.b .no_offset
cmp.l #$200,d0
bge.w illegal_addr
btst #0,d0
bne.w illegal_addr
move.l d0,custom_offset
move.l d0,d3
bsr evaluate ;edit ?
bne.b .no_offset
lea.l custom,a3
move.w d0,(a3,d3.l)
bra.w end_command
.no_offset move.l custom_offset,d5
moveq #8-1,d7 ;print 8 lines
.loop cmp.l #$200,d5
bge.b .noprint
bsr make_e_line
addq.l #2,d5
lea.l general_txt,a0
bsr print
dbf d7,.loop
.noprint move.l d5,custom_offset
bra.w end_command
;-> d5=offset
;<- general_txt filled with e_line
make_e_line movem.l d0-a4,-(a7)
lea.l custom_names,a2
lea.l custom,a3
lea.l general_txt,a0
move.w #"e ",(a0)+
move.b #"$",(a0)+
moveq #3,d1
move.w d5,d0
bsr conv_hex ;print offset
add.l d1,a0
move.w #" $",(a0)+
move.w (a3,d5.w),d0
moveq #4,d1
bsr conv_hex ;print register value
add.l d1,a0
move.l #" ; ",(a0)+
lea.l (a2,d5.w*4),a4
move.l (a4)+,(a0)+
move.l (a4)+,(a0)+
move.w #$0a00,(a0)+
movem.l (a7)+,d0-a4
rts
;-------------- scroll up e_line -----------
cmdu_e move.l ascII_ptr,a0
lea.l 80(a0),a0
cmp.w #'e ',(a0) ;last top line was an e_line ?
bne.b .noe
addq.l #2,a0
bsr evaluate ;get last offset
subq.l #2,d0
bmi.b .noe
move.l d0,d5
bsr.b make_e_line
lea.l general_txt,a0
bsr print
subq.w #1,(2,a3) ;cursor one line up
moveq #0,d0
.noe rts
;-------------- scroll down e_line ---------
cmdd_e move.l ascII_ptr,a0
move.l d0,-(a7)
move.w window_bot,d0
subq.w #2,d0
mulu #80,d0
add.l d0,a0
move.l (a7)+,d0
cmp.w #'e ',(a0) ;last line was an e_line ?
bne.b .noe
addq.l #2,a0
bsr evaluate ;get last address
addq.l #2,d0
cmp.l #$200,d0
bge.b .noe
move.l d0,d5
bsr make_e_line
addq.l #2,d5
move.l d5,custom_offset
subq.w #1,(2,a3) ;cursor one line up
lea.l general_txt,a0
bsr print
moveq #0,d0
.noe rts
;-------------- delete a file or an empty dir ------------------
cmd_del lea.l ev_line,a1
bsr read_name ;get source name
tst.b (a1)
beq.w illegal_name
move.l #ev_line,d1
bsr delete_file
bra.w end_disk
;-------------- get partition info -----------------------------
cmd_part
move.l #floppy0,d0
lea.l part_txt(pc),a0
bsr print
.next move.l d0,a4
lea.l part_name(a4),a0
lea.l general_txt,a1
move.l a1,a2
moveq #8-1,d0
.fill move.l #" ",(a2)+
dbf d0,.fill
moveq #0,d0
move.b (a0)+,d0
bra.b .godbf
.copy move.b (a0)+,(a1)+ ;copy name
.godbf dbf d0,.copy
lea.l part2_txt(pc),a0
bsr print
lea.l general_txt,a0
sf 16(a0)
bsr print ;print name
lea.l part3_txt(pc),a0
cmp.l #ide_device,part_device(a4)
beq.b .ide
lea.l part4_txt(pc),a0
.ide bsr print ;device
move.l part_first(a4),d0
moveq #8,d1
bsr print_dec
lea.l part5_txt(pc),a0
bsr print
move.l part_nbsec(a4),d0
moveq #8,d1
bsr print_decCR
move.l part_next(a4),d0
bne.b .next
bra.w end_command
part_txt
dc.b "--- Name ----------- -- Device -- -- First Block ----- -- NbBlocks --------",$a,0
part2_txt dc.b " ",0
part5_txt dcb.b 11,$20
dc.b 0
part3_txt dc.b " IDE ",0
part4_txt dc.b " Floppy ",0
even
;-------------- get info from IDE drives -----------------------
cmd_ide tst.b config_IDE
bne.b .goide
lea.l .noide_txt(pc),a0
bsr print
bra.w end_disk
.goide tst.b config_elsat
beq.b .nocd32
lea.l .cd32_txt(pc),a0
bsr print
bra.b .cont
.nocd32 tst.b config_A1200
beq.b .go4000
lea.l .a1200_txt(pc),a0
bsr print
bra.b .cont
.go4000 lea.l .a4000_txt(pc),a0
bsr print
.cont lea.l secbuf,a0
tst.w IDE_info0
beq.b .nodrive0
moveq #0,d1 ;drive no 0
bsr Read_ID
bne.b .nodrive0
lea.l ide1_txt(pc),a0
bsr print
bsr .print_info
bra.b .okdrive0
.nodrive0 lea.l ide2_txt(pc),a0
bsr print
.okdrive0 lea.l secbuf,a0
tst.w IDE_info1
beq.b .nodrive1
moveq #1,d1 ;drive no 1
bsr Read_ID
bne.b .nodrive1
lea.l ide3_txt(pc),a0
bsr print
bsr .print_info
bra.b .okdrive1
.nodrive1 lea.l ide4_txt(pc),a0
bsr print
.okdrive1 moveq #0,d0
moveq #0,d1
tst.w IDE_info0
beq.b .no0
lea.l secbuf,a0
bsr Read_Block
.no0
bra.w end_disk
.noide_txt dc.b "No IDE interface",$a,0
.cd32_txt dc.b "ELSAT CD32 Pro Module IDE interface",$a,0
.a1200_txt dc.b "Gayle A1200 IDE interface",$a,0
.a4000_txt dc.b "Gayle A4000 IDE interface",$a,0
even
.print_info lea.l secbuf,a4
lea.l ide5_txt(pc),a0
bsr print
lea.l 27*2(a4),a0
move.w #$0a00,46*2(a4)
tst.w (a0)
bne.b .okname
lea.l ide10_txt(pc),a0
.okname bsr print ;name
lea.l ide6_txt(pc),a0
bsr print
lea.l 10*2(a4),a0
move.w #$0a00,19*2(a4)
tst.w (a0)
bne.b .okser
lea.l ide10_txt(pc),a0
.okser cmp.b #$20,(a0)+
beq.b .okser
subq.l #1,a0
move.l a0,a1
.seeke tst.b (a1)+
bne.b .seeke
move.b #$a,-2(a1)
bsr print ;serial
lea.l ide7_txt(pc),a0
bsr print
move.w 1*2(a4),d0
moveq #4,d1
bsr print_decCR ;cylinders
lea.l ide8_txt(pc),a0
bsr print
move.w 3*2(a4),d0
moveq #4,d1
bsr print_decCR ;heads
lea.l ide9_txt(pc),a0
bsr print
move.w 6*2(a4),d0
moveq #4,d1
bsr print_decCR ;sectors
lea.l ide11_txt(pc),a0
bsr print
moveq #5,d1
move.w 3*2(a4),d0
mulu 6*2(a4),d0 ;sec*heads
mulu 1*2(a4),d0 ;cyl*sec*heads
moveq #11,d1
lsr.l d1,d0
moveq #4,d1
bsr print_dec
lea.l ide12_txt(pc),a0
bsr print
rts
ide1_txt dc.b "-- Drive 0 : present",$a,0
ide2_txt dc.b "-- Drive 0 : absent",$a,0
ide3_txt dc.b "-- Drive 1 : present",$a,0
ide4_txt dc.b "-- Drive 1 : absent",$a,0
ide5_txt dc.b " Name : ",0
ide6_txt dc.b " Serial no : ",0
ide7_txt dc.b " Cylinders : ",0
ide8_txt dc.b " Heads : ",0
ide9_txt dc.b " Sectors : ",0
ide10_txt dc.b "N/A",$a,0
ide11_txt dc.b " Capacity : ",0
ide12_txt dc.b "(MB)",$a,0
even
;-------------- COPY --------------------------------------
cmd_copy
lea.l ev_line,a1
bsr read_name ;get source name
tst.b (a1)
beq.w illegal_name
lea.l general_txt,a1
bsr read_name ;get dest name
tst.b (a1)
beq.w illegal_name
bsr remove_pic
moveq #0,d6
moveq #0,d7
move.l #ev_line,d1
moveq #0,d2
bsr open_file
move.l d0,d6
beq.w .err
move.l #general_txt,d1
moveq #-1,d2
bsr open_file
move.l d0,d7
bne.b .okdest
cmp.w #FILEEXIST_ERR,drive_err
bne.w .err ;got only path without filename ?
clr.w drive_err
lea.l general_txt,a0
.seek tst.b (a0)+
bne.b .seek
subq.l #1,a0
cmp.b #':',-1(a0)
beq.b .noslash
move.b #'/',(a0)+
.noslash move.l d6,a1
lea.l file_name(a1),a1
moveq #0,d0
move.b (a1)+,d0
bra.b .godbf
.addname move.b (a1)+,(a0)+ ;add filename to dest
.godbf dbf d0,.addname
sf (a0)
move.l #general_txt,d1
moveq #-1,d2
bsr open_file ;retry with filename
move.l d0,d7
beq.b .err
.okdest
move.l d6,a0
move.l file_size(a0),d5
beq.b .err
move.w #-1,ts_size ;trainer buffer cleared
.nextblock move.l #tmp_mem_size,d3
cmp.l d3,d5
bge.b .okd5
move.l d5,d3
.okd5 sub.l d3,d5
move.l d6,d1
move.l #tmp_mem,d2
bsr read_file
tst.l d0
bne.b .err
move.l d7,d1
bsr write_file
tst.l d0
bne.b .err
tst.l d5
bne.b .nextblock
.err move.l d6,d1
beq.b .noclose1
bsr close_file
.noclose1 move.l d7,d1
beq.b .noclose2
bsr close_file
.noclose2
bsr set_pic
bra.w end_disk
;-------------- OUTPUT ------------------------------------
cmd_output bsr evaluate
bne.b .end
tst.l d0
beq.b .end
move.l d0,output_ptr
move.l d0,output_start
; move.l d0,watch2
bra.b .out
.end move.l output_ptr,d2
move.l output_start,d0
clr.l output_ptr
clr.l output_start
lea.l endout_txt,a0
bsr print
moveq #8,d1
bsr print_hex ;output_start
lea.l endout2_txt,a0
bsr print
move.l d2,d0 ;output_ptr
bsr print_hexCR
.out bra.w end_command
endout_txt dc.b "Output memory from $",0
endout2_txt dc.b " to $",0
cnop 0,4
;-------------- Q (compare memory) ------------------------
cmd_q bsr evaluate
bne.w illegal_addr
move.l d0,cmp_start
bsr evaluate
bne.w illegal_addr
move.l d0,cmp_end
sub.l cmp_start,d0
ble.w illegal_addr
bsr evaluate
bne.w illegal_addr
move.l d0,cmp_dest
bsr remove_pic
moveq #0,d0
move.l d0,$180(a6)
move.l cmp_start,a0
move.l cmp_dest,a1
move.l cmp_end,a2
moveq #-1,d0
.ok cmp.l a2,a0
bge.b .end_cmp
cmpm.b (a0)+,(a1)+
beq.b .ok
move.l a0,d0
subq.l #1,d0
.end_cmp
bsr set_pic
moveq #-1,d1
cmp.l d1,d0
beq.b .equal
moveq #8,d1
bsr print_hexCR
bra.b .out
.equal
lea.l equal_txt,a0
bsr print
.out
bra.w end_command
equal_txt dc.b "Equal areas.",$a,0
even
;-------------- A -----------------------------------------
cmd_a move.l a0,a3
bsr evaluate
bne.b .godisas
btst #0,d0
bne.w illegal_addr
move.l d0,a1
move.l a1,ass_addr
.skip cmp.b #$20,(a0)+
beq.b .skip
subq.l #1,a0
tst.b (a0)
bne.b .goas
.godisas move.l a3,a0
bra.w cmd_d
.goas jsr assemble
tst.l d0
bne.w illegal_syntax
.ok lea.l op68000,a0
move.l ass_addr,a4
bsr corr_addr
move.w oplen,d0
.copy move.w (a0)+,(a4)+
dbf d0,.copy
moveq #8,d1
move.l ass_addr,d0
moveq #0,d2
move.w oplen,d2
add.w d2,d2
addq.l #2,d2
add.l d2,d0
lea.l new_ass(pc),a0
bsr print
bsr print_hex
lea.l new_ass2(pc),a0
bsr print
bra.w end_command
new_ass dc.b "a $",0
new_ass2 dc.b " ",0
cnop 0,4
;-------------- O -----------------------------------------
;fill memory
cmd_o bsr evaluate
bne.w illegal_addr
move.l d0,fill_start
move.l d0,d1
bsr evaluate
bne.w illegal_addr
move.l d0,fill_end
sub.l d1,d0
ble.w illegal_addr
clr.w eval_size ;.b par default
bsr evaluate
bsr remove_pic
movem.l fill_start,a0-a1
move.w eval_size,d1
cmp.w #3,d1
beq.b .fillL
cmp.w #1,d1
beq.b .fillW
.fillb move.b d0,(a0)+
cmp.l a1,a0
blt.b .fillb
bra.b .out
.fillW move.w d0,(a0)+
cmp.l a1,a0
blt.b .fillW
bra.b .out
.fillL move.l d0,(a0)+
cmp.l a1,a0
blt.b .fillL
.out bsr set_pic
bra.w end_command
;-------------- Switch led --------------------------------
cmd_led bchg #1,$bfe001
bchg #1,CIAA+0
bra.w end_command
;-------------- PAL/NTSC ----------------------------------
cmd_pal clr.l OldRaster
move.w #$20,custom+$1dc
bra.w end_command
cmd_ntsc clr.l OldRaster
move.w #0,custom+$1dc
bra.w end_command
cmd_31k clr.l OldRaster
move.w #$3a0,custom+$1dc
bra.w end_command
;-------------- S (SAVEFILE) ------------------------------
cmd_s
lea.l ev_line,a1
bsr.w read_name
tst.b (a1)
beq.w illegal_name
bsr evaluate
bne.w illegal_addr
bne.w illegal_addr
move.l d0,d4 ;d4=save start
bsr evaluate
bne.w illegal_addr
bne.w illegal_addr
move.l d0,d3 ;d3=save end
move.l d0,d1
move.l d4,d0
sub.l d4,d3 ;d3=save len
ble.w illegal_addr ;end must be > start
bsr remove_pic
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.b .err
move.l d4,d2
move.l d7,d1
bsr write_file ;save mem
move.l d7,d1
bsr close_file
.err bsr set_pic
bra.w end_disk
;-------------- MAKEDIR -----------------------------------
cmd_makedir lea.l ev_line,a1
bsr.w read_name
tst.b (a1)
beq.w illegal_name
move.l #ev_line,d1
bsr create_dir
bra.w end_disk
;-------------- SA ----------------------------------------
;-------------- save the actual state in a file -----------
cmd_sa
lea.l ev_line,a1
bsr.w read_name
tst.b (a1)
beq.w illegal_name
sub.l a0,a0
move.l max_chip,a1
bsr search_cop
move.w drive,-(a7)
moveq #3,d4 ;first drive SEL (drive0)
lea.l drive_present,a3
moveq #4-1,d5 ;4 drives
.loopd tst.b (a3)+
beq.b .nodrive
move.w d4,drive ;get
bsr inittete ;floppy drive head pos
.nodrive addq.w #1,d4
dbf d5,.loopd
move.w (a7)+,drive
bsr remove_pic
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.w .err
move.w #-1,ts_size ;trainer buffer cleared
lea.l tmp_mem,a4
move.l #"ARSV",(a4)
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr write_file ;save header 'ARSV'
bne.w .err
move.l d7,d1
move.l #registres,d2
move.l #end_registres-registres,d3
bsr write_file ;save registers
bne.w .err
move.l d7,d1
move.l #custom,d2
move.l #$200,d3
bsr write_file ;save custom registers
bne.w .err
move.l d7,d1
move.l #palette,d2
move.l #256*4,d3
bsr write_file ;save palette
bne.w .err
move.l d7,d1
move.l #CIAA,d2
moveq #32,d3
bsr write_file ;save CIA registers
bne.w .err
move.l d7,d1
move.l #old_head,d2
moveq #4*2,d3
bsr write_file ;write head pos of drives
bne.w .err
move.l d7,a0
move.l file_part(a0),a0
cmp.l #floppy_device,part_device(a0)
bne.w .goHD
;-------------- floppy save routine ----------------
move.l d7,d1
moveq #0,d2
move.l #$CD000,d3
bsr write_file ;write data on Disk1
bne.w .err
move.l d7,d1
bsr close_file
bsr flush_fbuffer
bsr force_change
bsr set_pic
lea.l disk2_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.w .err
lea.l tmp_mem,a4
move.l #"ARS2",(a4)
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr write_file
bne.w .err
move.l d7,d1
move.l #$CD000,d2
move.l d2,d3
bsr write_file ;write data on Disk2
bne.w .err
move.l d7,d1
bsr close_file
bsr flush_fbuffer
bsr force_change
bsr set_pic
lea.l disk3_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.b .err
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.b .err
lea.l tmp_mem,a4
move.l #"ARS3",(a4)
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr write_file
bne.b .err
move.l d7,d1
move.l #$CD000*2,d2
move.l #$200000-$CD000*2,d3
bsr write_file ;write data on Disk3
bne.b .err
bra.b .endsave
.goHD move.l d7,d1
moveq #0,d2
move.l #$200000,d3
bsr write_file ;save all CHIPMEM
bne.b .err
.endsave move.l d7,d1
bsr close_file
.err bsr set_pic
bra.w end_disk
disk1_txt dc.b "Please insert disk 1 and press any key.",$d,0
disk2_txt dc.b "Please insert disk 2 and press any key.",$d,0
disk3_txt dc.b "Please insert disk 3 and press any key.",$d,0
diskclr_txt dc.b " ",$d,0
even
;-------------- SAC ---------------------------------------
;-------------- save the actual state in a file compressed
cmd_sac
lea.l ev_line,a1
bsr.w read_name
tst.b (a1)
beq.w illegal_name
sub.l a0,a0
move.l max_chip,a1
bsr search_cop
move.w drive,-(a7)
moveq #3,d4 ;first drive SEL (drive0)
lea.l drive_present,a3
moveq #4-1,d5 ;4 drives
.loopd tst.b (a3)+
beq.b .nodrive
move.w d4,drive ;get
bsr inittete ;floppy drive head pos
.nodrive addq.w #1,d4
dbf d5,.loopd
move.w (a7)+,drive
bsr remove_pic
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.w .err
move.w #-1,ts_size ;trainer buffer cleared
lea.l tmp_mem,a4
move.l #"ARSC",(a4)
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr write_file ;save header 'ARSC'
bne.w .err
move.l d7,d1
move.l #registres,d2
move.l #end_registres-registres,d3
bsr write_file ;save registers
bne.w .err
move.l d7,d1
move.l #custom,d2
move.l #$200,d3
bsr write_file ;save custom registers
bne.w .err
move.l d7,d1
move.l #palette,d2
move.l #256*4,d3
bsr write_file ;save palette
bne.w .err
move.l d7,d1
move.l #CIAA,d2
moveq #32,d3
bsr write_file ;save CIA registers
bne.w .err
move.l d7,d1
move.l #old_head,d2
moveq #4*2,d3
bsr write_file ;write head pos of drives
bne.w .err
move.l d7,a0
move.l file_part(a0),a0
cmp.l #floppy_device,part_device(a0)
bne.w .goHD
;-------------- floppy save routine ----------------
move.l d7,d1
moveq #0,d2
move.l #$4008,d3
bsr write_file ;write low-mem
bne.w .err
lea.l $4008.w,a0
sub.l a1,a1
move.l #$200000-$4008,d0
bsr pack
move.l d0,d6 ;d6=packed size
move.l d6,d3
move.l #1730*512-$4008-$68e,d0 ;size left on disk
cmp.l d0,d3
blt.b .okd3
move.l d0,d3
.okd3 sub.l d3,d6
move.l d7,d1
moveq #0,d2
bsr write_file ;write data on 1st disk
bne.w .err
move.l d7,d1
bsr close_file
tst.l d6
beq.w .lowmem
;----------
bsr flush_fbuffer
bsr force_change
bsr set_pic
lea.l disk2_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.w .err
lea.l tmp_mem,a4
move.l #"ARC2",(a4)
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr write_file
bne.w .err
move.l d6,d3
move.l #1730*512-4,d0
cmp.l d0,d3
blt.b .okd3b
move.l d0,d3
.okd3b sub.l d3,d6
move.l d7,d1
move.l #1730*512-$4008-$68e,d2 ;size saved on 1st disk
bsr write_file
bne.w .err
move.l d7,d1
bsr close_file
tst.l d6
beq.w .enddisk
;----------
bsr flush_fbuffer
bsr force_change
bsr set_pic
lea.l disk3_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
move.l #ev_line,d1 ;ptr on filename
moveq #-1,d2 ;mode create
bsr open_file
move.l d0,d7
beq.w .err
lea.l tmp_mem,a4
move.l #"ARC3",(a4)
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr write_file
bne.w .err
move.l d6,d3
move.l d7,d1
move.l #(1730*512-$4008-$68e)+(1730*512-4),d2
;size saved on disks 1&2
bsr write_file
bne.w .err
.retry move.l d7,d1
bsr close_file
.enddisk bsr flush_fbuffer
bsr force_change
clr.w drive_err
bsr set_pic
lea.l disk1_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
.lowmem move.l #ev_line,d1
moveq #0,d2
bsr open_file
move.l d0,d7
beq.b .enddisk
lea.l tmp_mem,a4
move.l a4,d2
moveq #4,d3
move.l d7,d1
bsr read_file
bne.b .retry
cmp.l #"ARSC",(a4)
bne.b .retry
move.l d7,d1
move.l #$68e,d2
moveq #-1,d3
bsr seek_file
sub.l a0,a0
lea.l $4008.w,a1
bsr depack
move.l d7,d1
moveq #0,d2
move.l #$4008,d3
bsr read_file
bra.b .endsave
;-----------------------------------------------
.goHD move.l d7,d1
moveq #0,d2
move.l #$4008,d3
bsr write_file ;save low-mem
bne.b .err
lea.l $4008.w,a0
lea.l $0.w,a1
move.l #$200000-$4008,d0
bsr pack
move.l d0,d3
move.l d0,d5 ;d5=packed size+header
move.l d7,d1
moveq #0,d2
bsr write_file ;save packed mem
bne.b .err
lea.l $0.w,a0
lea.l $4008.w,a1
bsr depack
move.l d7,d1
move.l d5,d2
add.l #$4008,d2
neg.l d2
moveq #0,d3
bsr seek_file
move.l d7,d1
moveq #0,d2
move.l #$4008,d3
bsr read_file
.endsave move.l d7,d1
bsr close_file
.err bsr set_pic
bra.w end_disk
;-------------- LA ----------------------------------------
;-------------- load a saved game -------------------------
cmd_la lea.l ev_line,a1
bsr.w read_name
tst.b (a1)
beq.w illegal_name
bsr remove_pic
move.l #ev_line,d1 ;ptr on filename
moveq #0,d2 ;mode oldfile
bsr open_file
move.l d0,d7
beq.w .err
lea.l tmp_mem,a4
move.w #-1,ts_size ;trainer buffer cleared
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr read_file ;read header 'ARSV'
bne.w .err
sf packed
cmp.l #'ARSV',(a4)
beq.b .okarsv
st packed
cmp.l #'ARSC',(a4)
beq.b .okarsv
lea.l noarsv_txt(pc),a0
bsr print
bra.w .close
.okarsv
move.l d7,d1
move.l #registres,d2
move.l #end_registres-registres,d3
bsr read_file ;read registers
bne.w .err
move.l d7,d1
move.l #custom,d2
move.l #$200,d3
bsr read_file ;read custom registers
bne.w .err
lea.l custom,a1
lea.l $dff000,a2
lea.l move_list2(pc),a0
move.w #$100-1,d0
.loop tst.b (a0)+
beq.b .nomove
move.w (a1),(a2) ;reinit custom registers
.nomove addq.l #2,a1
addq.l #2,a2
dbf d0,.loop
clr.w $dff088
move.w #0,$dff106
move.w #0,$dff180
move.l d7,d1
move.l #palette,d2
move.l #256*4,d3
bsr read_file ;read palette
bne.w .err
move.l d7,d1
move.l #CIAA,d2
moveq #32,d3
bsr read_file ;read CIA registers
bne.w .err
move.l d7,d1
move.l a4,d2
moveq #8,d3
bsr read_file ;read drive headpos
lea.l old_head,a1
move.l a4,a2
move.w drive,-(a7)
moveq #3,d4 ;first drive SEL (drive0)
lea.l drive_present,a3
moveq #4-1,d5 ;4 drives
.loopd tst.b (a3)+
beq.b .nodrive
move.w d4,drive ;init
bsr inittete ;floppy drive head pos
move.w (a2),(a1) ;init old_head
.nodrive addq.w #1,d4
addq.l #2,a1
addq.l #2,a2
dbf d5,.loopd
move.w (a7)+,drive
move.l d7,a0
move.l file_part(a0),a0
cmp.l #floppy_device,part_device(a0)
bne.w .goHD
;-------------- floppy load --------------------
tst.b packed
beq.w .nopackedf
;-------------- packed floppy load ---------
move.l d7,d1
move.l #$4008,d2
moveq #0,d3
bsr seek_file ;skip low-mem
move.l d7,d1
moveq #0,d2
move.l #1730*512-$68e-$4008,d3
bsr read_file ;read 1st disk
move.l $0.w,d6
bpl.b .okposf
neg.l d6
.okposf addq.l #8,d6 ;d6=packed size
move.l d1,a0
move.l file_size(a0),d0
sub.l #$68e+$4008,d0
move.l d0,d5
sub.l d0,d6
beq.w .lowmem
.retry2c move.l d7,d1
bsr close_file
.retry2bc bsr set_pic
lea.l disk2_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
clr.w drive_err
move.l #ev_line,d1 ;ptr on filename
moveq #0,d2 ;mode oldfile
bsr open_file
move.l d0,d7
beq.b .retry2bc
lea.l tmp_mem,a4
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr read_file
bne.b .retry2c
cmp.l #"ARC2",(a4)
bne.b .retry2c
move.l d7,d1
move.l d5,d2
move.l #1730*512-4,d3
bsr read_file ;read disk2
move.l d1,a0
move.l file_size(a0),d0
subq.l #4,d0
sub.l d0,d6
beq.b .enddisk
add.l d0,d5
.retry3c move.l d7,d1
bsr close_file
.retry3bc bsr set_pic
lea.l disk3_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
clr.w drive_err
move.l #ev_line,d1 ;ptr on filename
moveq #0,d2 ;mode oldfile
bsr open_file
move.l d0,d7
beq.b .retry3bc
lea.l tmp_mem,a4
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr read_file
bne.b .retry3c
cmp.l #"ARC3",(a4)
bne.b .retry3c
move.l d7,d1
move.l d5,d2
move.l #1730*512-4,d3
bsr read_file ;read disk3
.enddisk
move.l d7,d1
bsr close_file
;ask disk1 and read low-mem
.retry1 bsr set_pic
lea.l disk1_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
clr.w drive_err
move.l #ev_line,d1 ;ptr on filename
moveq #0,d2 ;mode oldfile
bsr open_file
move.l d0,d7
beq.b .retry1
lea.l tmp_mem,a4
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr read_file
bne.b .enddisk
cmp.l #"ARSC",(a4)
bne.b .enddisk
.lowmem move.l d7,d1
move.l #$68e,d2
moveq #-1,d3
bsr seek_file
sub.l a0,a0
lea.l $4008.w,a1
bsr depack
move.l d7,d1
moveq #0,d2
move.l #$4008,d3
bsr read_file ;read low-mem
bra.w .close
;-------------- non-packed floppy load -----
.nopackedf move.l d7,d1
moveq #0,d2
move.l #$CD000,d3
bsr read_file
bne.w .err
.retry2 move.l d7,d1
bsr close_file
.retry2b bsr set_pic
lea.l disk2_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
clr.w drive_err
move.l #ev_line,d1 ;ptr on filename
moveq #0,d2 ;mode oldfile
bsr open_file
move.l d0,d7
beq.b .retry2b
lea.l tmp_mem,a4
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr read_file
bne.b .retry2
cmp.l #"ARS2",(a4)
bne.b .retry2
move.l d7,d1
move.l #$CD000,d2
move.l d2,d3
bsr read_file ;read data from disk2
bne.w .err
.retry3 move.l d7,d1
bsr close_file
.retry3b bsr set_pic
lea.l disk3_txt(pc),a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
bsr remove_pic
tst.b break
bne.w .err
clr.w drive_err
move.l #ev_line,d1 ;ptr on filename
moveq #0,d2 ;mode oldfile
bsr open_file
move.l d0,d7
beq.b .retry3b
lea.l tmp_mem,a4
move.l d7,d1
move.l a4,d2
moveq #4,d3
bsr read_file
bne.b .retry3
cmp.l #"ARS3",(a4)
bne.b .retry3
move.l d7,d1
move.l #2*$CD000,d2
move.l #$200000-2*$CD000,d3
bsr read_file ;read data from disk3
bne.w .err
bra.w .close
;------------------------------------------------
.goHD tst.b packed
beq.b .nopacked
move.l d7,d1
move.l #$4008,d2
moveq #0,d3
bsr seek_file ;skip low-mem
move.l d7,d1
moveq #0,d2
moveq #8,d3
bsr read_file ;read pack header
bne.b .err
move.l $0.w,d3 ;get packed size
bpl.b .okpos
neg.l d3
.okpos move.l d7,d1
moveq #8,d2
move.l d3,d5
bsr read_file ;read packed data
lea.l $0.w,a0
lea.l $4008.w,a1
bsr depack
move.l d7,d1
move.l d5,d2
add.l #$4008+8,d2
neg.l d2
moveq #0,d3
bsr seek_file
move.l d7,d1
moveq #0,d2
move.l #$4008,d3
bsr read_file ;read low-mem area
bra.b .close
.nopacked move.l d7,d1
moveq #0,d2
move.l #$200000,d3
bsr read_file ;read all CHIPMEM
bne.b .err
.close move.l d7,d1
bsr close_file
.err bsr set_pic
bra.w end_disk
noarsv_txt dc.b "Not a HRTmon save file !",$a,0
even
;-------------- list of registers to be initialised after la_cmd ----
move_list2 dcb.b $10,0 ;$00-$1e
dc.b -1,-1,-1 ;$20-$24
dc.b 0,0,0,0 ;$26-$2c
dcb.b 5,-1 ;$2e-$36
dcb.b 4,0 ;$38-$3e
dcb.b $c,-1 ;$40-$56
dc.b 0,0 ;$58,$5a
dc.b 0,0 ;$5c,$5e
dcb.b 4,-1 ;$60-$66
dcb.b 4,0 ;$68-$6e
dc.b -1,-1,-1 ;$70-$74
dcb.b 4,0 ;$76-$7c
dc.b -1 ;$7e
dc.b -1,-1 ;$80,$82 ;cop1
dc.b -1,-1 ;$84,$86 ;cop2
dc.b 0,0,0 ;$88,$8a,$8c
dc.b -1,-1,-1,-1 ;$8e,$90,$92,$94
dc.b 0,-1,0,0 ;$96-$9c
dcb.b $21,-1 ;$9e-$de
dcb.b $10,-1 ;$e0-$fe
dc.b 0,0,-1,0 ;$100-$106
dc.b -1,-1,0 ;$108-$10c
dc.b -1 ;$10e
dcb.b 8,0 ;$110-$11e
dcb.b $10,-1 ;$120-$13e
dcb.b $20,0 ;$140-$17e
dcb.b $20,0 ;$180-$1be
dcb.b $d,-1 ;$1c0-$1d8
dc.b 0 ;$1da
dc.b 0 ;$1dc
dc.b -1,-1,-1 ;$1de-$1e2
dc.b 0 ;$1e4
dcb.b 5,-1 ;$1e6-$1ee
dcb.b 6,0 ;$1f0-$1fa
dc.b 0 ;$1fc
dc.b 0 ;$1fe
;-------------- MOTOR -------------------------------------
cmd_motor bsr motor_on
bra.w end_command
;----------------------------------------------------------
cmd_intel lea.l outside_txt(pc),a0
bsr print
lea.l cheat_cnt,a0
tst.b (a0)
beq.b .zero
sf (a0)
bra.b .out
.zero addq.b #1,(a0)
.out bra.w end_command
outside_txt dc.b "OUTSIDE !",$a,0
even
cmd_hornet lea.l hornet_txt(pc),a0
bsr print
lea.l cheat_cnt,a0
cmp.b #1,(a0)
beq.b .zero
sf (a0)
bra.b .out
.zero addq.b #1,(a0)
.out bra.w end_command
hornet_txt dc.b "Illegal but nice command.",$a,0
even
;-------------- TSD deep trainer start --------------------
cmd_tsd st ts_deep
bra.b cmd_ts_go
;-------------- TS trainer start --------------------------
cmd_ts sf ts_deep
cmd_ts_go bsr evaluate ;get start address
bne.w illegal_addr
move.l d0,ts_start
bsr evaluate ;get end address
bne.w illegal_addr
move.l d0,ts_end
sub.l ts_start,d0
ble.w illegal_addr
movem.l ts_start,d0-d1
btst #0,d0 ;even address ?
bne.w illegal_addr
btst #0,d1 ;even address ?
bne.w illegal_addr
clr.w eval_size ;.b par default
bsr evaluate ;get nb of lives in d0
bne.w illegal_val
move.w eval_size,ts_size ;.b .w .l (0,1,2)
lea.l tmp_mem,a0
bsr live_scan
bra.w end_command
;--------------------------------------
;-> d0=nb of lives
;-> a0=start of trainer buffer in 'tmp_mem'
live_scan move.l ts_end,d1
cmp.l ts_start,d1
beq.w .noscan
move.l d0,d3
tst.b ts_deep
beq.b .nodeep
addq.l #1,d0 ;d0=max val
subq.l #1,d3 ;d3=min val
.nodeep
move.w ts_size,d1 ;.b .w .l (0,1,2)
beq.w .go_b
cmp.w #1,d1
bne.b .go_l
lea.l tmp_mem+tmp_mem_size,a3
subq.l #4,a3 ;for end signal
move.l ts_start,a1
move.l ts_end,a2
.seek1 move.l a1,a4
move.l a1,watch
CORR_ADDR 1
cmp.w (a4),d3
bgt.b .no_eg1
cmp.w (a4),d0
blt.b .no_eg1
move.l a1,(a0)+
cmp.l a3,a0
bge.w .end_seek
.no_eg1 addq.l #2,a1
tst.b break
bne.w .end_seek
cmp.l a2,a1
blt.b .seek1
bra.w .end_seek
.go_l lea.l tmp_mem+tmp_mem_size,a3
subq.l #4,a3 ;for end signal
move.l ts_start,a1
move.l ts_end,a2
.seek2 move.l a1,a4
move.l a1,watch
CORR_ADDR 2
cmp.l (a4),d3
bgt.b .no_eg2
cmp.l (a4),d0
blt.b .no_eg2
move.l a1,(a0)+
cmp.l a3,a0
bge.b .end_seek
.no_eg2 addq.l #2,a1
tst.b break
bne.b .end_seek
cmp.l a2,a1
blt.b .seek2
bra.b .end_seek
.go_b lea.l tmp_mem+tmp_mem_size,a3
subq.l #4,a3 ;for end signal
move.l ts_start,a1
move.l ts_end,a2
.seek3 move.l a1,a4
move.l a1,watch
CORR_ADDR 3
cmp.b (a4),d3
bgt.b .no_eg3
cmp.b (a4),d0
blt.b .no_eg3
move.l a1,(a0)+
cmp.l a3,a0
bge.b .end_seek
.no_eg3 addq.l #1,a1
tst.b break
bne.b .end_seek
cmp.l a2,a1
blt.b .seek3
.end_seek move.l #-1,(a0) ;end signal
moveq #8,d1
lea.l ts_txt,a0
bsr print
move.l ts_start,d0
bsr print_hex
lea.l ts1_txt,a0
bsr print
move.l a1,d0
move.l a1,ts_start
bsr print_hexCR
.noscan rts
ts_txt dc.b "Scan range : $",0
ts1_txt dc.b " - $",0
even
;-------------- TF trainer find ---------------------------
cmd_tf
bsr evaluate ;read new nb of lives
bne.w illegal_val
move.l d0,d7 ;new nb of lives=d7
move.l d7,d3
move.l d7,d4
tst.b ts_deep
beq.b .nodeep
addq.l #1,d3 ;d3=max val
subq.l #1,d4 ;d4=min val
.nodeep lea.l tmp_mem,a1
move.l a1,a2
moveq #-1,d2
move.w ts_size,d1
bpl.b .oksize
lea.l firstts_txt(pc),a0
bsr print
bra.w end_command
.oksize beq.w .go_b
cmp.w #1,d1
bne.b .go_l
moveq #8,d1
.seek1 tst.b break
bne.w .end_seek
cmp.l (a1),d2
beq.w .end_seek
move.l (a1)+,a4
CORR_ADDR 1
cmp.w (a4),d4
bgt.b .seek1
cmp.w (a4),d3
blt.b .seek1
move.l -4(a1),d0
move.l d0,(a2)+
lea.l tf_txt+1,a0
bsr conv_hex
lea.l tf_txt,a0
bsr print
bra.b .seek1
.go_l moveq #8,d1
.seek2 tst.b break
bne.w .end_seek
cmp.l (a1),d2
beq.w .end_seek
move.l (a1)+,a4
CORR_ADDR 2
cmp.l (a4),d4
bgt.b .seek2
cmp.l (a4),d3
blt.l .seek2
move.l -4(a1),d0
move.l d0,(a2)+
lea.l tf_txt+1,a0
bsr conv_hex
lea.l tf_txt,a0
bsr print
bra.b .seek2
.go_b moveq #8,d1
.seek3 tst.b break
bne.b .end_seek
cmp.l (a1),d2
beq.b .end_seek
move.l (a1)+,a4
CORR_ADDR 3
cmp.b (a4),d4
bgt.b .seek3
cmp.b (a4),d3
blt.b .seek3
move.l -4(a1),d0
move.l d0,(a2)+
lea.l tf_txt+1,a0
bsr conv_hex
lea.l tf_txt,a0
bsr print
bra.b .seek3
.end_seek move.l d2,(a2) ;set new end signal
cmp.l #tmp_mem+tmp_mem_size-4,a2
bge.b .noscan
move.l a2,a0 ;tmp_mem buffer
move.l d7,d0 ;nb of lives
bsr live_scan
.noscan tst.w cursor_x
beq.b .no_CR
lea.l cr_txt,a0
bsr print
.no_CR bra.w end_command
firstts_txt dc.b "First use TS command !",$a,0
even
;-------------- debug -------------------------------------
cmd_debug bsr remove_pic
not.b debug
beq.w .clear
move.l vbr_reg,a0
move.l $8(a0),exc8 ;BUS
move.l $c(a0),excC ;Address
move.l $10(a0),exc10 ;Illegal
move.l $14(a0),exc14 ;Zero
move.l $28(a0),exc28 ;LineA
move.l $2C(a0),exc2C ;LineF
lea.l debug_bus(pc),a1
move.l a1,$8(a0)
lea.l debug_addr(pc),a1
move.l a1,$C(a0)
lea.l debug_illegal(pc),a1
move.l a1,$10(a0)
lea.l debug_zero(pc),a1
move.l a1,$14(a0)
lea.l debug_linea(pc),a1
move.l a1,$28(a0)
lea.l debug_linef(pc),a1
move.l a1,$2c(a0)
lea.l debug1_txt,a0
bsr print
bra.w .okset
.clear move.l vbr_reg,a0
lea.l debug_bus(pc),a1
cmp.l $8(a0),a1
bne.b .no8
move.l exc8,$8(a0)
.no8 lea.l debug_addr(pc),a1
cmp.l $C(a0),a1
bne.b .noC
move.l excC,$C(a0)
.noC lea.l debug_illegal(pc),a1
cmp.l $10(a0),a1
bne.b .no10
move.l exc10,$10(a0)
.no10 lea.l debug_zero(pc),a1
cmp.l $14(a0),a1
bne.b .no14
move.l exc14,$14(a0)
.no14 lea.l debug_linea(pc),a1
cmp.l $28(a0),a1
bne.b .no28
move.l exc28,$28(a0)
.no28 lea.l debug_linef(pc),a1
cmp.l $2C(a0),a1
bne.b .no2C
move.l exc2C,$2C(a0)
.no2C
lea.l debug2_txt,a0
bsr print
.okset bsr set_pic
bra.w end_command
debug1_txt dc.b "Debug mode on.",$a,0
debug2_txt dc.b "Debug mode off.",$a,0
even
debug_bus move.b #1,debug_entry
jmp monitor
debug_addr move.b #2,debug_entry
jmp monitor
debug_illegal move.b #3,debug_entry
jmp monitor
debug_zero move.b #4,debug_entry
jmp monitor
debug_linea move.b #5,debug_entry
jmp monitor
debug_linef move.b #6,debug_entry
jmp monitor
;debug_entry 1=bus,2=addr,3=illegal,4=zero,5=linea,6=linef
;-------------- print if entered from debug mode ----------
check_debug movem.l d0/a0,-(a7)
moveq #0,d0
move.b debug_entry,d0
beq.b .nodeb
move.l debug_txt(pc,d0.w*4),a0
bsr print
sf debug_entry
.nodeb movem.l (a7)+,d0/a0
rts
debug_txt dc.l 0
dc.l .bus_txt
dc.l .addr_txt
dc.l .illegal_txt
dc.l .zero_txt
dc.l .linea_txt
dc.l .linef_txt
.bus_txt dc.b "Debug mode: Bus error",$a,0
.addr_txt dc.b "Debug mode: Illegal address",$a,0
.illegal_txt dc.b "Debug mode: Illegal instruction",$a,0
.zero_txt dc.b "Debug mode: Division by zero",$a,0
.linea_txt dc.b "Debug mode: Line-A instruction",$a,0
.linef_txt dc.b "Debug mode: Line-F instruction",$a,0
even
;----------------------------------------------------------
;-------------- jmp here when you finish a command --------
;-------------- which had something to do with the disk ---
;NODISK_ERR equ 1
;TRACKCORRUPT_ERR equ 2
;BADCHECKSUM_ERR equ 3
;NOTDOS_ERR equ 4
;WRITEPROTECT_ERR equ 5
;CREATEFILE_ERR equ 6
;FILENOTFOUND_ERR equ 7
;DISKFULL_ERR equ 8
;FILEEXIST_ERR equ 9
;DEVICENOTFOUND_ERR equ 10
;ILLEGALPATH_ERR equ 11
;NOFFS_ERR equ 12
;IDE_ERR equ 13
;NOTEMPTY_ERR equ 14
end_disk: bsr flush_fbuffer ;flush file buffers
bsr motor_off
clr.l bitmap_part ;clear bitmap buffer
clr.l file_handle1 ;free
clr.l file_handle2 ;both file_handle
lea.l track_sector,a0
moveq #-1,d1
move.l d1,(a0)+
move.l d1,(a0)+
move.l d1,(a0)+
move.w d1,track_buffer_no
move.w drive_err,d0
beq.w .noerr
clr.w drive_err
lea.l no_disk_txt,a0 ;1
subq.w #1,d0
beq.w .ok
lea.l corrupt_txt,a0 ;2
subq.w #1,d0
beq.w .ok
lea.l bad_sum_txt,a0 ;3
subq.w #1,d0
beq.b .ok
lea.l NotDOS_txt,a0 ;4
subq.w #1,d0
beq.b .ok
lea.l WriteProt_txt,a0 ;5
subq.w #1,d0
beq.b .ok
lea.l CreateFile_txt,a0 ;6
subq.w #1,d0
beq.b .ok
lea.l FileNotFound_txt,a0 ;7
subq.w #1,d0
beq.b .ok
lea.l DiskFull_txt,a0 ;8
subq.w #1,d0
beq.b .ok
lea.l FileExists_txt,a0 ;9
subq.w #1,d0
beq.b .ok
lea.l DeviceNotFound_txt,a0 ;10
subq.w #1,d0
beq.b .ok
lea.l IllegalPath_txt,a0 ;11
subq.w #1,d0
beq.b .ok
lea.l NoFFS_txt,a0 ;12
subq.w #1,d0
beq.b .ok
lea.l IDEerr_txt,a0 ;13
subq.w #1,d0
beq.b .ok
lea.l NotEmpty_txt,a0 ;14
; subq.w #1,d0
; beq.b .ok
; nop
.ok
bsr print
.noerr tst.b small_pic
beq.b .nosmall
sf no_print
bsr print_page
sf small_pic
.nosmall
bra.w end_command
;-------------- type mem ------------------------
cmd_type bsr evaluate
bne.w illegal_addr
move.l d0,a0
bsr print
bra.w end_command
;-------------- find ----------------------------
cmd_f bsr evaluate
bne.w illegal_addr
move.l d0,find_start
bsr evaluate
bne.w illegal_addr
move.l d0,find_end
movem.l find_start,d0-d1
cmp.l d0,d1
ble.w illegal_addr
lea.l find_list,a1
moveq #0,d1 ;nb bytes
.loop clr.w eval_size
bsr evaluate
bmi.w illegal_val
bgt.b .end_find
move.w eval_size,d2
move.w d2,d3
.next addq.w #1,d1
move.b d0,(a1,d2.w)
lsr.l #8,d0
dbf d2,.next
addq.w #1,d3
add.w d3,a1
cmp.l #find_list+80,a1
blt.b .loop
.end_find subq.w #1,d1
bmi.w illegal_val
movem.l find_start,a0-a1
cmp.l a0,a1
ble.w illegal_addr
lea.l find_list,a2
move.b (a2)+,d0
.seek cmp.l a1,a0
bge.b .end_seek
tst.b break
bne.b .end_seek
move.l a0,watch
move.l a0,a4
CORR_ADDR
addq.l #1,a0
cmp.b (a4)+,d0
bne.b .seek
move.w d1,d2
move.l a2,a3
bra.b .dbf
.comp move.b (a3)+,d3
cmp.b (a4)+,d3
bne.b .seek
.dbf dbf d2,.comp
movem.l d0-d1/a0,-(a7)
move.l a0,d0
subq.l #1,d0
lea.l ev_line,a0
move.w #$2020,8(a0)
clr.b 10(a0)
moveq #8,d1
bsr conv_hex
bsr print
movem.l (a7)+,d0-d1/a0
bra.b .seek
.end_seek tst.w cursor_x
beq.b .no_CR
lea.l cr_txt,a0
bsr print
.no_CR
bra.w end_command
cr_txt dc.b $a,0
;-------------- find instruction ----------------
cmd_fi bsr evaluate
bne.w illegal_addr
and.w #$fffe,d0
move.l d0,find_start
bsr evaluate
bne.w illegal_addr
and.w #$fffe,d0
move.l d0,find_end
movem.l find_start,d0-d1
cmp.l d0,d1
ble.w illegal_addr
lea.l find_list,a1
bsr read_name
tst.b (a1)
beq.w illegal_string
.re_jok lea.l find_list,a0
cmp.b #'*',(a0) ;remove jokers at begining of line
bne.b .lower
.shift move.b 1(a0),(a0)+
bne.b .shift
bra.b .re_jok
.lower move.b (a0),d0
beq.b .end_list
bsr lower_case
move.b d0,(a0)+
bra.b .lower
.end_list movem.l find_start,a0-a1
cmp.l a0,a1
ble.w illegal_addr
move.l a1,d7
lea.l ev_line,a1
move.l a1,d6
lea.l find_list,a1
move.l a1,d5
moveq #$a,d4
.loop2 cmp.l d7,a0
bge.w .end_fi
tst.b break
bne.w .end_fi
move.l a0,watch
move.l a0,-(a7)
move.l a0,a4
bsr corr_addr
move.l d6,a0 ;ev_line
moveq #%100,d0 ;lower case, no d $address,indirect
bsr disassemble
move.l d5,a0 ;find_list
move.b (a0)+,d0
move.l d6,a1 ;ev_line
.seek move.b (a1)+,d1
cmp.b d4,d1
beq.b .no_fi
cmp.b d0,d1
bne.b .seek
move.l a0,a2
move.l a1,a3
.loop move.b (a2)+,d2
beq.b .ok
move.b (a3)+,d1
cmp.b d4,d1
beq.b .seek
cmp.b #'*',d2 ;joker
beq.b .loop
cmp.b d2,d1
beq.b .loop
bra.b .seek
.ok
move.l (a7),a4
CORR_ADDR
move.l d6,a0 ;ev_line
moveq #%111,d0 ;upper case, d $address, indirect
bsr disassemble
move.l d6,a0
bsr print ;print disas. line
.no_fi move.l (a7)+,a0
addq.l #2,a0
bra.w .loop2
.end_fi
bra.w end_command
;-------------- find instruction famicom -------------
cmd_fif bsr evaluate
bne.w illegal_addr
move.l d0,find_start
bsr evaluate
bne.w illegal_addr
move.l d0,find_end
movem.l find_start,d0-d1
lea.l find_list,a1
bsr read_name
tst.b (a1)
beq.w illegal_string
lea.l find_list,a0
.upper move.b (a0),d0
beq.b .end_list
bsr upper_case
move.b d0,(a0)+
bra.b .upper
.end_list movem.l find_start,a0-a1
cmp.l a0,a1
ble.w illegal_addr
move.l a1,d7
lea.l ev_line+10,a1
move.l a1,d6
lea.l find_list,a1
move.l a1,d5
moveq #$a,d4
.loop2 cmp.l d7,a0
bge.w .end_fi
tst.b break
bne.w .end_fi
move.l a0,watch
move.l a0,-(a7)
move.l a0,a4
CORR_ADDR
move.l d6,a0 ;ev_line+10
bsr f_disassemble
move.l d5,a0 ;find_list
move.b (a0)+,d0
move.l d6,a1 ;ev_line+10
.seek move.b (a1)+,d1
cmp.b d4,d1
beq.b .no_fi
cmp.b d0,d1
bne.b .seek
move.l a0,a2
move.l a1,a3
.loop move.b (a2)+,d2
beq.b .ok
move.b (a3)+,d1
cmp.b d4,d1
beq.b .seek
cmp.b d2,d1
beq.b .loop
bra.b .seek
.ok move.l (a7),d0
moveq #8,d1
lea.l ev_line,a0
move.b #' ',9(a0)
move.b #' ',(a0)+
bsr conv_hex
lea.l ev_line,a0
bsr print
.no_fi move.l (a7)+,a0
addq.l #1,a0
bra.w .loop2
.end_fi
bra.w end_command
;-------------- change drive no -----------------
cmd_drive bsr evaluate
bmi.w illegal_val
beq.b .chg
moveq #0,d0
move.w drive,d0
subq.w #3,d0
.chg moveq #1,d1
cmp.l d1,d0
bgt.w illegal_val
tst.l d0
bmi.w illegal_val
lea.l drive_present,a0
tst.b (a0,d0.w) ;drive is present ?
beq.w illegal_val
addq.w #3,d0
move.w d0,drive
subq.b #3,d0
lea.l drive_txt,a0
bsr print
moveq #1,d1
bsr print_hexCR
bra.w end_command
;-------------- exit monitor --------------------
cmd_x st escape
bra.w end_command
;-------------- KILL --------------------------------------
cmd_kill st escape
st kill
bra.w end_command
;-------------- REBOOT ------------------------------------
cmd_reboot
bsr remove_pic
move.l $4.w,a0
move.l a0,d0
lsr.l #1,d0
bcs.w .nosafe
lea.l 34(a0),a1
moveq #0,d0
moveq #$18-1,d1
.add add.w (a1)+,d0
dbf d1,.add
not.w d0
cmp.w 82(a0),d0
bne.w .nosafe
bsr set_pic
lea.l surereboot_txt(pc),a0
bsr print
bsr get_key
lea.l sure2_txt(pc),a0
bsr print
cmp.b #'y',d0
bne.b .no
bsr remove_pic
move.l $4.w,a0
clr.l ColdCapture(a0)
move.l #cool-start+$50000,CoolCapture(a0)
st reboot
lea.l 34(a0),a1
moveq #0,d0
moveq #$18-1,d1
.add2 add.w (a1)+,d0
dbf d1,.add2
not.w d0
move.w d0,82(a0)
move.l $f80004,a0
subq.l #2,a0
move.l a0,pc_reg
move.w #$2700,sr_reg
st escape
bsr set_pic
.no bra.w end_command
.nosafe lea.l nosafe_txt(pc),a0
bsr print
bra.w end_command
nosafe_txt dc.b "HRTmon can't reboot and stay resident !",$a
dc.b "You have to perform this operation when ExecBase is still valid !",$a,0
surereboot_txt dc.b "The machine will reboot!",$a
dc.b "HRTmon will still be accessible to debug bootdisks",$a
dc.b "Are you sure you want to continue ? (y/n)",$d,0
even
cool movem.l d1-a6,-(a7)
move.l $4.w,a0
clr.l CoolCapture(a0)
lea.l 34(a0),a1
moveq #0,d0
moveq #$18-1,d1
.add add.w (a1)+,d0
dbf d1,.add
not.w d0
move.w d0,82(a0)
lea.l $50000,a0
lea.l start,a1
move.l a1,a2
move.w #$2f000/4-1,d0
.copy move.l (a0)+,(a1)+ ;restore HRTmon to its place
dbf d0,.copy
move.l $4.w,a6
jsr -636(a6) ;clear cache
jmp .next
.next move.l $4.w,a6
lea.l .super(pc),a5
jsr -30(a6)
move.l mon_size(pc),d0
beq.b .noalloc
lea.l start,a1
jsr -204(a6)
tst.l d0
bne.b .noalloc
clr.l mon_size ;alloc failed
.noalloc
sf entered
;.wait move.w $dff006,d0
; and.w #$ff,d0
; move.w #0,$dff106
; move.w d0,$dff180
; btst #6,$bfe001
; bne.b .wait
movem.l (a7)+,d1-a6
moveq #0,d0
rts
.super movec VBR,a4
move.l a4,old_vbr
lea.l new_except,a0
move.l a0,a1
lea.l except_entry(pc),a2
move.w #$400/4-1,d1
.init move.l a2,(a1)+
dbf d1,.init
suba.l a1,a1
move.w #$400/4-1,d1
.copy2 move.l (a4)+,(a1)+
dbf d1,.copy2
move.l $7c(a0),oldlev7
move.l #monitor,$7c(a0)
movec a0,VBR
rte
;-------------- restart program at address ------
cmd_g bsr evaluate
bmi.w illegal_addr
bne.b .noaddr
move.l d0,pc_reg
.noaddr st escape
bra.w end_command
;-------------- Load AmigaDOS file --------------
cmd_l lea.l ev_line,a1
bsr read_name
tst.b (a1)
beq.w illegal_name
bsr evaluate
bne.w illegal_addr
tst.l d0
bmi.w illegal_addr
move.l d0,d4
bsr remove_pic
move.l #ev_line,d1
moveq #0,d2 ;old file
bsr open_file
move.l d0,d7
beq.b .noopen
move.l d4,d2
move.l d7,a1
move.l file_size(a1),d3
move.l d3,d6
move.l d3,d1
add.l d2,d1 ;end address
move.l d2,d0
move.l d7,d1
bsr read_file
.bad move.l d7,d1
bsr close_file
.noopen bsr set_pic
tst.w drive_err
bne.b .end
lea.l file_len_txt,a0
bsr print
moveq #8,d1
move.l d6,d0
bsr print_hexCR
.end bra.w end_disk
;-------------- cd dir --------------------------
cmd_cd lea.l ev_line,a1
bsr read_name
tst.b (a1)
beq.b .nochg
move.l #ev_line,d1
bsr change_dir
.nochg lea.l ev_line,a0
sf (a0)
move.l a0,d1
bsr ExNext
tst.l d0
bmi.b .err
move.l d1,a3 ;partition
move.l d2,d0 ;parent block no
bsr print_path ;path
.err bra.w end_disk
;-------------- dir -----------------------------
cmd_dir lea.l ev_line,a1
bsr read_name
moveq #0,d6 ;nb files printed
move.l #ev_line,d1
bsr ExNext
tst.l d0
bmi.w .err
move.l d0,-(a7)
move.l d1,a3 ;partition
move.l d2,d0 ;parent block no
bsr print_path ;path
move.l (a7)+,d0
tst.l d0 ;empty dir ?
beq.w .err
.loop addq.l #1,d6
move.l d0,a1
lea.l general_txt,a0
move.b #' ',d0
move.l a0,a2
moveq #31-1,d2
.fill move.b d0,(a2)+
dbf d2,.fill
sf (a2)
lea.l file_name(a1),a2
moveq #0,d0
move.b (a2)+,d0 ;get file name size
bra.b .godbf
.copyn move.b (a2)+,(a0)+
.godbf dbf d0,.copyn
lea.l general_txt,a0
bsr print ;print filename
tst.b file_dir(a1)
beq.b .okfile
lea.l dir_txt,a0
bsr print
bra.b .okdir
.okfile move.l file_size(a1),d0
moveq #7,d1
bsr print_dec
.okdir lea.l spc_txt,a0
bsr print
move.l d6,d0 ;nb files printed in d0
move.w screen_height,d1
subq.w #5,d1
lsl.w #1,d1
divu d1,d0 ;pause after 46(PAL) files printed
swap d0
tst.w d0
bne.b .no46
bsr get_key ;wait for key pressed
.no46
tst.b break
bne.b .err
move.l a1,d1
bsr ExNext
tst.l d0
bgt.w .loop
.err lsr.l #1,d6
bcc.b .nocr
lea.l cr_txt,a0
bsr print
.nocr
bra.w end_disk
dir_txt dc.b " (DIR)",0
spc_txt dc.b " ",0
even
;-------------- calculate BootBlock checksum --------------
cmd_bb bsr evaluate
bne.w illegal_addr
move.l d0,a0
move.l a0,a1
clr.l 4(a1)
moveq #0,d0
move.w #512*2/4-1,d1
.add add.l (a0)+,d0
bcc.b .noc
addq.l #1,d0
.noc dbf d1,.add
not.l d0
move.l d0,4(a1)
bra.w end_command
;-------------- floppy access -------------------
cmd_disk1 move.b #'R',d0
bra.b go_disk
cmd_disk2 move.b #'W',d0
go_disk move.b d0,rwsec
bsr evaluate
bne.w illegal_addr
move.l d0,sec_addr
bsr evaluate
bne.w illegal_val
tst.l d0
bmi.w illegal_val
cmp.l #1759,d0
bgt.w illegal_val
move.w d0,strtsec
move.l d0,d1
bsr evaluate
bne.w illegal_val
tst.l d0
bmi.w illegal_val
move.w d0,nbsec
add.l d0,d1
cmp.l #1760,d1
bgt.w illegal_val
move.l sec_addr,d0
move.w nbsec,d1
mulu #512,d1
add.l d0,d1
bsr remove_pic
bsr test_present
bne.b .end_write
move.l sec_addr,a0
movem.w strtsec,d0-d1
cmp.b #'W',rwsec
bne.b .no_write
bsr write2
bsr force_change
bra.b .end_write
.no_write bsr read2
.end_write bsr set_pic
bra.w end_disk
;----------------------------------------------------------
;-------------- test if a disk is present -----------------
;-------------- if disk changed then flush track_buffer ---
;-------------- used by non FileSystem commands (RS,WS...)-
;<- FLAGS 0=ok_present
test_present movem.l d0/a3,-(a7)
lea.l floppy0,a3
cmp.w #3,drive
beq.b .go0
lea.l floppy1,a3
.go0 moveq #0,d0 ;test cmd
bsr floppy_change
tst.w drive_err
movem.l (a7)+,d0/a3
rts
;--------------------------------------------------------------------
;-------------- force change_disk to floppy selected in 'drive' -----
;-> drive
force_change movem.l d0/a2-a3,-(a7)
lea.l floppy0,a3
cmp.w #3,drive
beq.b .f0
cmp.w #4,drive
bne.b .end
lea.l floppy1,a3
.f0 move.l part_device(a3),a2
clr.l part_filesystem(a3)
moveq #1,d0 ;force change cmd
jsr CHANGE_CMD(a2)
clr.l bitmap_part ;clear bitmap buffer
.end movem.l (a7)+,d0/a2-a3
rts
;-------------- disk check ----------------------
cmd_diskchk
moveq #0,d6
move.w #160-1,d7
.check move.l d6,d0
lea.l fbuf1,a0
bsr read_fsector
tst.w drive_err
bne.b .error
tst.b break
bne.b .error
add.w #11,d6
dbf d7,.check
lea.l .ok_txt(pc),a0
bsr print
.error
bsr force_change
bra.w end_disk
.ok_txt dc.b "Floppy disk is OK.",$a,0
;-------------- format disk ---------------------
fconfirm1_txt dc.b "Format disk in drive ",0
fconfirm2_txt dc.b " (y/n) ?",$d,0
even
cmd_format lea.l ev_line,a1
bsr.w read_name
lea.l fconfirm1_txt,a0
bsr print
move.w drive,d0
subq.w #3,d0
moveq #1,d1
bsr print_dec
lea.l fconfirm2_txt,a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
cmp.b #'y',d0
bne.w .endformat
bsr test_present
bne.w .endformat
lea.l $40000,a0 ;dummy addr for format
moveq #0,d0
moveq #-1,d1 ;format all disk
moveq #-1,d7 ;write
bsr access
tst.b break
bne.b .break
lea.l format_block,a0
lea.l secbuf,a1
moveq #512/16-1,d0
.copy move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
dbf d0,.copy
lea.l ev_line,a1
tst.b (a1)
beq.w .no_set
move.l a1,d1 ;source name (ended by a zero)
lea.l secbuf+108*4,a2 ;dest BCPL
bsr copy_name2
.no_set
lea.l secbuf,a0
bsr calc_sum
move.w #880,d0
bsr write_fsector
lea.l format_block+512,a0
move.w #881,d0
bsr write_fsector
bsr write_flush
.break bsr force_change
.endformat
bra.w end_disk
;-------------- FORMATQ ------------------------
cmd_formatq lea.l ev_line,a1
bsr.w read_name
lea.l fconfirm1_txt,a0
bsr print
move.w drive,d0
subq.w #3,d0
moveq #1,d1
bsr print_dec
lea.l fconfirm2_txt,a0
bsr print
bsr get_key
lea.l diskclr_txt(pc),a0
bsr print
cmp.b #'y',d0
bne.w .endformat
bsr test_present
bne.w .endformat
lea.l format_block,a0
lea.l secbuf,a1
moveq #512/16-1,d0
.copy move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
dbf d0,.copy
lea.l ev_line,a1
tst.b (a1)
beq.b .no_set
move.l a1,d1 ;source name (ended by a zero)
lea.l secbuf+108*4,a2 ;dest BCPL
bsr copy_name2
.no_set
lea.l secbuf,a0
bsr calc_sum
move.w #880,d0
bsr write_fsector
lea.l format_block+512,a0
move.w #881,d0
bsr write_fsector
lea.l secbuf,a0
move.l a0,a1
moveq #512/4-1,d0
.clr clr.l (a1)+
dbf d0,.clr
move.l #$444f5301,(a0) ;'DOS',1 (FFS)
moveq #0,d0
bsr write_fsector
bsr write_flush
bsr force_change
.endformat
bra.w end_disk
;-------------- evaluate expression -------------
cmd_ev bsr evaluate
bne.w illegal_expr
lea.l ev_line,a0
move.b #'$',(a0)+
moveq #8,d1
bsr conv_hex
addq.l #8,a0
moveq #$20,d6
move.b d6,(a0)+
moveq #10,d1
bsr conv_dec
move.b d6,(a0)+
move.b #'"',(a0)+
moveq #0,d1
lea.l ascIIx,a1
rol.l #8,d0
move.b d0,d1
move.b (a1,d1.w),(a0)+
rol.l #8,d0
move.b d0,d1
move.b (a1,d1.w),(a0)+
rol.l #8,d0
move.b d0,d1
move.b (a1,d1.w),(a0)+
rol.l #8,d0
move.b d0,d1
move.b (a1,d1.w),(a0)+
move.b #'"',(a0)+
move.b d6,(a0)+
move.b #'%',(a0)+
moveq #4-1,d2
.loop3 moveq #8-1,d1
.loop2 addx.l d0,d0
bcc.b .zero
move.b #'1',(a0)+
bra.b .un
.zero move.b #'0',(a0)+
.un dbf d1,.loop2
move.b #'.',(a0)+
dbf d2,.loop3
subq.l #1,a0
move.b #$a,(a0)+
clr.b (a0)+
lea.l ev_line,a0
bsr print
bra.w end_command
;-------------- direct keyboard read (without IRQ) -------
;<- dkey
get_dkey movem.l d0-d2,-(a7)
move.b $bfed01,d0
btst #3,d0
beq.b no_dkey
move.b $bfec01,d0
not.b d0
ror.b #1,d0
bset #6,$bfee01
cmp.b #$78,d0
beq.w go_reset
moveq #8-1,d1
.wait move.b 6(a6),d2
.ras cmp.b 6(a6),d2
beq.b .ras
dbf d1,.wait
bclr #6,$bfee01
move.b d0,dkey
no_dkey movem.l (a7)+,d0-d2
rts
;-------------- show registres (R) --------------
cmd_r
seek_reg move.b (a0)+,d0
beq.w end_chg_reg
cmp.b #$20,d0
beq.b seek_reg
subq.l #1,a0
bsr read_reg ;read registre (no of reg in d0)
move.w d0,d5 ;save no registre in d5
bmi.w illegal_reg
seek_reg_val move.b (a0)+,d0
beq.w illegal_val
cmp.b #$20,d0
beq.b seek_reg_val
subq.l #1,a0
bsr evaluate
bne.w illegal_val
cmp.w #16,d5
blt.b ok_simple_reg
;-----------------------------------------------
bne.b no_pc_chg
move.l d0,pc_reg
bra.b end_chg_reg
;-----------------------------------------------
no_pc_chg cmp.w #19,d5
bne.b no_usp_chg
move.l d0,usp_reg
;-----------------------------------------------
no_usp_chg cmp.w #20,d5
bne.b no_ssp_chg
move.l d0,ssp_reg
;-----------------------------------------------
no_ssp_chg cmp.w #17,d5
bne.b no_sr_chg
move.w d0,sr_reg
bra.b end_chg_reg
;-----------------------------------------------
no_sr_chg cmp.w #18,d5
bne.b no_vbr_chg
move.l d0,vbr_reg
bra.b end_chg_reg
;-----------------------------------------------
no_vbr_chg cmp.w #21,d5
bne.b no_cacr_chg
move.l d0,cacr_reg
bra.b end_chg_reg
;-----------------------------------------------
no_cacr_chg cmp.w #22,d5
bne.b no_pcr_chg
move.l d0,msp_reg
bra.b end_chg_reg
;-----------------------------------------------
no_pcr_chg cmp.w #23,d5
bne.b no_busr_chg
move.l d0,caar_reg
bra.b end_chg_reg
;-----------------------------------------------
no_busr_chg
bra.b end_chg_reg
ok_simple_reg lea.l registres,a0
lsl.w #2,d5
move.l d0,(a0,d5.w)
end_chg_reg bsr print_reg
bra.w end_command
;-------------- print all registres -------------
print_reg movem.l d0-d1/a0-a1/a4,-(a7)
moveq #8,d1
lea.l registres,a1
move.l (a1)+,d0
lea.l data0_reg+3,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data0_reg+3+9,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data0_reg+3+18,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data0_reg+3+27,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data4_reg,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data4_reg+9,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data4_reg+18,a0
bsr conv_hex
move.l (a1)+,d0
lea.l data4_reg+27,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr0_reg+3,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr0_reg+3+9,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr0_reg+3+18,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr0_reg+3+27,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr4_reg,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr4_reg+9,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr4_reg+18,a0
bsr conv_hex
move.l (a1)+,d0
lea.l addr4_reg+27,a0
bsr conv_hex
move.l pc_reg,d0
lea.l pc_txt+3,a0
bsr conv_hex
move.l ssp_reg,d0
lea.l ssp_txt+4,a0
bsr conv_hex
move.l usp_reg,d0
lea.l usp_txt+4,a0
bsr conv_hex
move.l vbr_reg,d0
lea.l vbr_txt+4,a0
bsr conv_hex
move.l cacr_reg,d0
lea.l CACR_txt+5,a0
bsr conv_hex
move.l caar_reg,d0
lea.l CAAR_txt+5,a0
bsr conv_hex
move.l msp_reg,d0
lea.l MSP_txt+4,a0
bsr conv_hex
move.l isp_reg,d0
lea.l ISP_txt+4,a0
bsr conv_hex
lea.l sr_txt+3,a0
moveq #4,d1
move.w sr_reg,d0
bsr conv_hex
move.l a7_reg,a0
and.w #$2000,d0
beq.b no_superv_stack
addq.l #6,a0
move.l a0,a4
bsr corr_addr
move.w (a4),d0 ;stack frame
lsr.w #4,d0
lsr.w #8,d0
add.w d0,d0
lea.l frame,a4
add.w (a4,d0.w),a0
no_superv_stack move.l pc_reg,a4
bsr corr_addr
move.b #'S',rts_txt+2
cmp.w #$4e73,(a4) ;cmp if RTE
bne.b no_rte
addq.l #2,a0 ;jmp SR for RTE
move.b #'E',rts_txt+2
no_rte move.l a0,a4
bsr corr_addr
move.l (a4),d0 ;read RTS address
lea.l rts_txt+4,a0
moveq #8,d1
bsr conv_hex
lea.l registre_txt,a0
bsr print
jsr init_regBMON
movem.l (a7)+,d0-d1/a0-a1/a4
rts
frame dc.w 2,2,6,2,2,2,2,2,22,14,24,40,2,2,2 ;all stack frame size
********************************************************************
;-------------- print single instruction at dis_ptr ---------------
;d0 returns instruction len
single_inst movem.l d1-d7/a0-a4,-(a7)
move.l dis_ptr,a4
bsr corr_addr
lea.l general_txt,a0
moveq #7,d0 ;upper case, d $address, indir. address
bsr disassemble
lea.l general_txt,a0
bsr print
movem.l (a7)+,d1-d7/a0-a4
rts
***************************************************************
;-------------- hex dump (H) ---------------------
cmd_h moveq #0,d1
seek_para_h move.b (a0)+,d0
beq.w ok_h_cmd ;keep last address
cmp.b #$20,d0
beq.b seek_para_h
subq.l #1,a0
bsr evaluate ;returns address in d0
bne.w illegal_addr
move.l d0,hex_ptr
move.l d0,a3
.loop move.b (a0)+,d0
beq.w ok_h_cmd
cmp.b #"'",d0
beq.b ok_h_ascII
cmp.b #$20,d0
beq.b .loop
subq.l #1,a0
st label
move.w #1,eval_size ;set .W par default
bsr evaluate
beq.b .oky
sf label
bra.w illegal_val
.oky sf label
move.l a3,a4
bsr corr_addr
move.w eval_size,d2
.next move.b d0,(a4,d2.w)
lsr.l #8,d0
addq.l #1,a3
dbf d2,.next
st d1
bra.b .loop
ok_h_ascII tst.b d1
bne.b ok_h_cmd
move.l hex_ptr,a3
.loop move.b (a0)+,d0
beq.b ok_h_cmd
cmp.b #"'",d0
beq.b ok_h_cmd
move.l a3,a4
bsr corr_addr
move.b d0,(a4)
st d1
addq.l #1,a3
bra.b .loop
ok_h_cmd tst.b d1
bne.w end_command
move.l hex_ptr,a4 ;a4=mem ptr
move.l a4,d0
moveq #8-1,d3 ;print 8 lines
moveq #15,d5
.loop2 bsr make_hex_line
lea.l 16(a4),a4
lea.l hex_txt,a0
bsr print
tst.b break
dbne d3,.loop2
move.l a4,hex_ptr
bra.w end_command
;-------------- up arrow cmd ---------------
;-> d2 = scroll step (1 or SC_STEP)
cmdu_h move.l ascII_ptr,a0
move.w d2,d0
mulu #80,d0
add.l d0,a0
cmp.w #'h ',(a0) ;last top line was an hex dump ?
bne.b .noh
addq.l #2,a0
bsr evaluate ;get last address
move.l d2,d1
lsl.l #4,d1 ;*16
sub.l d1,d0
move.l d0,a4
subq.w #1,d2
.print bsr make_hex_line
lea.l 16(a4),a4
lea.l hex_txt,a0
bsr print
dbf d2,.print
clr.w 2(a3)
; lea.l hex_txt2,a1
; move.b #$d,18(a1)
; move.b #$a,18(a1)
moveq #0,d0
.noh rts
;-------------- down arrow cmd -------------
cmdd_h move.l ascII_ptr,a0
move.w window_bot,d0
subq.w #1,d0
sub.w d2,d0
mulu #80,d0
add.l d0,a0
cmp.w #'h ',(a0) ;last line was an hex dump ?
bne.b .noh
addq.l #2,a0
bsr evaluate ;get last address
add.l #16,d0
move.l d0,a4
sub.w d2,(2,a3)
subq.w #1,d2
.print bsr make_hex_line
lea.l hex_txt,a0
bsr print
lea.l 16(a4),a4
dbf d2,.print
move.l a4,hex_ptr
moveq #0,d0
.noh rts
;-> a4=address to dump
;<- hex_txt is filled with the dump text
make_hex_line movem.l d0-a4,-(a7)
moveq #$0f,d5
move.l a4,d0
bsr corr_addr
lea.l ascIIx,a1
lea.l hex_list,a3
lea.l hex_txt+3,a0 ;print address
moveq #8,d1
bsr conv_hex
lea.l hex_txt+3+8+2,a0 ;long list
lea.l hex_txt2+1,a2 ;ascII print
moveq #2,d1 ;2 for conv_hex
moveq #0,d0
moveq #8-1,d6
.loopb moveq #2-1,d2
.loop move.b (a4)+,d0
move.b (a1,d0.w),(a2)+
move.w d0,d4
and.w d5,d4
lsr.w #4,d0
move.b (a3,d0.w),(a0)+
move.b (a3,d4.w),(a0)+
dbf d2,.loop
addq.l #2,a0
dbf d6,.loopb
movem.l (a7)+,d0-a4
rts
***************************************************************
;-------------- ascII dump (n) ---------------------
cmd_n
seek_para_n move.b (a0)+,d0
beq.b ok_n_cmd ;keep last address
cmp.b #$20,d0
beq.b seek_para_n
subq.l #1,a0
bsr evaluate ;returns address in d0
bne.w illegal_addr
move.l d0,asc_ptr
ok_n_cmd move.l asc_ptr,a4 ;a4=mem ptr
move.l a4,d0
moveq #8-1,d3 ;print 8 lines
.loop2 moveq #$a,d0
bsr make_ascII_line
lea.l general_txt,a0
bsr print
lea.l 64(a4),a4
tst.b break
dbne d3,.loop2
move.l a4,asc_ptr
bra.w end_command
;-------------- scroll up ascII dump ----------------------
cmdu_n move.l ascII_ptr,a0
move.w d2,d0
mulu #80,d0
add.l d0,a0
cmp.w #'n ',(a0) ;last top line was an ascII dump ?
bne.b .non
addq.l #2,a0
bsr evaluate ;get last address
move.l d2,d1
lsl.l #6,d1 ;*64
sub.l d1,d0
move.l d0,a4
subq.w #1,d2
.print moveq #$a,d0
bsr make_ascII_line
lea.l general_txt,a0
bsr print
lea.l 64(a4),a4
dbf d2,.print
clr.w (2,a3)
moveq #0,d0
.non rts
;-------------- scroll down ascII dump --------------------
cmdd_n move.l ascII_ptr,a0
move.w window_bot,d0
subq.w #1,d0
sub.w d2,d0
mulu #80,d0
add.l d0,a0
cmp.w #'n ',(a0) ;last line was an ascII dump ?
bne.b .non
addq.l #2,a0
bsr evaluate ;get last address
add.l #64,d0
move.l d0,a4
sub.w d2,(2,a3)
subq.w #1,d2
.print moveq #$a,d0
bsr make_ascII_line
lea.l general_txt,a0
bsr print
lea.l 64(a4),a4
dbf d2,.print
move.l a4,asc_ptr
moveq #0,d0
.non rts
;-> a4=mem ptr
;-> d0=end line ascII ($a or $d)
;<- general_txt filled with ascII line
make_ascII_line movem.l d0-a4,-(a7)
move.b d0,d7
lea.l ascIIx,a1
move.l a4,d0
bsr corr_addr
lea.l general_txt,a0
move.b #'n',(a0)+
move.b #' ',(a0)+
move.b #'$',(a0)+
moveq #8,d1
bsr conv_hex
lea.l 8(a0),a0
move.b #' ',(a0)+
moveq #0,d0
moveq #64-1,d2
.loop move.b (a4)+,d0
move.b (a1,d0.w),(a0)+
dbf d2,.loop
move.b d7,(a0)+
sf (a0)+
movem.l (a7)+,d0-a4
rts
*********************************************************************
;correct address to access, to make the screen mem of AR transparent.
;-> a4=address to correct
;<- a4=address corrected
;<- corr_val=offset to add to get the corrected address
corr_addr: clr.l corr_val
cmpa.l #LOSIZE-64,a4
bge.b .ok_hex_low
add.l #backup_pic,a4
move.l #backup_pic,corr_val
.ok_hex_low rts
***************************************************
;-------------- trace mode ------------------------
cmd_t move.b (a0)+,d0
beq.w single_trace
cmp.b #$20,d0
beq.b cmd_t
bsr upper_case
cmp.b #'A',d0
bne.b no_trace_a
;-------------- trace till address reached -----
seek_tracea move.b (a0)+,d0
beq.w illegal_addr
cmp.b #$20,d0
beq.b seek_tracea
subq.l #1,a0
bsr evaluate
bne.w illegal_addr
btst #0,d0
bne.w illegal_addr
move.l d0,trace_address
st escape
bra.w end_command
;-------------- trace x steps -----------
no_trace_a subq.l #1,a0
bsr evaluate
bne.w illegal_val
tst.l d0
beq.w illegal_val
cmp.l #$10000,d0
bge.w illegal_val
init_trace move.w d0,trace_count
st escape
bra.w end_command
single_trace moveq #1,d0
bra.b init_trace
;---------------------------------------
trace_reach move.l a0,-(a7)
lea.l trace_count,a0
subq.w #1,(a0)
beq.b end_trace_mode
move.l (a7)+,a0
or.w #$8000,(a7)
rte
end_trace_mode move.l vbr_reg,a0
move.l old_trace,$24(a0)
move.l (a7)+,a0
and.w #$7fff,(a7)
bra.w monitor
;---------------------------------------------
tracea_reach move.l d0,-(a7)
move.l trace_address,d0
cmp.l 2+4(a7),d0
beq.b end_tracea
move.l (a7)+,d0
or.w #$8000,(a7)
rte
end_tracea move.l (a7)+,d0
move.l a0,-(a7)
move.l vbr_reg,a0
move.l old_trace,$24(a0)
lea.l trace_address,a0
move.l #-1,(a0)
move.l (a7)+,a0
and.w #$7fff,(a7)
bra.w monitor
***************************************************
;-------------- copy memory -----------------------
;-------------- and exg (CE) memory ---------------
cmd_c move.b (a0),d0
bsr upper_case
sf exgc
cmp.b #'E',d0
bne.b no_exgc
st exgc
addq.l #1,a0
no_exgc move.b (a0)+,d0
beq.w illegal_addr
cmp.b #$20,d0
beq.b no_exgc
subq.l #1,a0
bsr evaluate
bne.w illegal_addr
move.l d0,copy_start
seek_end_copy move.b (a0)+,d0
beq.w illegal_addr
cmp.b #$20,d0
beq.b seek_end_copy
subq.l #1,a0
bsr evaluate
bne.w illegal_addr
move.l d0,copy_end
seek_dest_copy move.b (a0)+,d0
beq.w illegal_addr
cmp.b #$20,d0
beq.b seek_dest_copy
subq.l #1,a0
bsr evaluate
bne.w illegal_addr
move.l d0,copy_dest
movem.l copy_start,d0-d1
sub.l d0,d1 ;length
move.l copy_dest,d0
add.l d0,d1
movem.l copy_start,d0-d1
cmp.l d0,d1
ble.w illegal_addr ;if end<start
move.l d0,a0
move.l d1,a2
move.l copy_dest,a1
bsr remove_pic
moveq #0,d0
move.l d0,$180(a6)
tst.b exgc
beq.b do_copy_mem
do_copye_mem move.b (a0),d0
move.b (a1),(a0)+
move.b d0,(a1)+
cmp.l a2,a0
blt.b do_copye_mem
bra.b end_copy
do_copy_mem move.b (a0)+,(a1)+
cmp.l a2,a0
blt.b do_copy_mem
end_copy bsr set_pic
bra.w end_command
***************************************************
;-------------- break point set -------------------
cmd_b move.b (a0)+,d0
beq.w illegal_addr
bsr upper_case
moveq #0,d7
cmp.b #'J',d0
bne.w no_jmp_break
moveq #-1,d7 ;jsr break mode on
bra.b seek_break
no_jmp_break cmp.b #'D',d0
bne.b no_del_break
lea.l break_list,a0
moveq #-1,d0
do_clr_all_BP tst.l (a0)
bmi.b cleared_all_BP
clr.l (a0)
move.w d0,4(a0)
move.l d0,6(a0)
lea.l 10(a0),a0
bra.b do_clr_all_BP
cleared_all_BP lea.l all_BP_txt,a0
bsr print
bra.w end_command
;-------------------------------------------
no_del_break subq.l #1,a0
seek_break move.b (a0)+,d0
beq.w print_break
cmp.b #$20,d0
beq.b seek_break
subq.l #1,a0
bsr evaluate
bne.w illegal_addr
btst #0,d0
bne.w illegal_addr
move.l d0,a2
;-------------- check if clear BP command ------------
lea.l break_list,a1
seek_clear_BP tst.l (a1)
bmi.b end_clear_BP
cmp.l (a1),a2
beq.b pre_clear_BP
lea.l 10(a1),a1
bra.b seek_clear_BP
pre_clear_BP cmp.w #-1,4(a1)
bne.w do_clear_BP
lea.l 10(a1),a1
bra.b seek_clear_BP
;-------------- add BP to list -----------------------
end_clear_BP lea.l break_list,a1
seek_free_break tst.l (a1)
bmi.w too_break
tst.l (a1)
bne.b break_used
cmp.w #-1,4(a1)
beq.b ok_break
break_used lea.l 10(a1),a1
bra.b seek_free_break
ok_break tst.l d7
beq.b no_jsrb_set
move.l a2,(a1) ;save address
move.l a2,a4
bsr corr_addr
move.w (a4),4(a1) ;save instr.
move.l 2(a4),6(a1) ;save param.
moveq #8,d1
move.l a2,d0
lea.l BPJ_set_txt,a0
bsr print
bsr print_hexCR
bra.b ok_jsrb_set
no_jsrb_set move.l a2,(a1)
move.l a2,a4
bsr corr_addr
move.w (a4),4(a1) ;save instr.
moveq #8,d1
move.l a2,d0
lea.l BP_set_txt,a0
bsr print
bsr print_hexCR
ok_jsrb_set
bra.w end_command
;-------------- do clear BP command -----------------------
do_clear_BP move.w 4(a1),(a2)
clr.l (a1)
move.l 6(a1),d0
cmp.l #-1,d0
beq.b no_jsrb_clr
move.l d0,2(a2)
no_jsrb_clr move.l #-1,6(a1)
move.w #-1,4(a1)
moveq #8,d1
move.l a2,d0
lea.l BP_clr_txt,a0
bsr print
bsr print_hexCR
bra.w end_command
;-------------- init break points when exiting AR -------------
init_break movem.l d0-d2/a0-a2,-(a7)
sf break_mode
sf BP_reach
sf BPJ_reach
sf BPatPC
lea.l break_list,a0
set_BP tst.l (a0)
bmi.b end_set_BP
bne.b set_break
cmp.w #-1,4(a0)
bne.b set_break
lea.l 10(a0),a0
bra.b set_BP
set_break cmp.l #-1,6(a0)
beq.b no_BJSR_set
move.l (a0),a1
move.w #$4eb9,(a1) ;JSR
lea.l JSR_reach,a2
move.l a2,2(a1)
st no_kill ;don't kill AR on exit
bra.b end_BJ_set
no_BJSR_set move.l (a0),a1
cmp.l pc_reg,a1
bne.b .notpc
st BPatPC
move.w #1,trace_count
bra.b end_BJ_set
.notpc move.w #$4afc,(a1)
st no_kill ;don't kill AR on exit
st break_mode
end_BJ_set lea.l 10(a0),a0
bra.b set_BP
end_set_BP tst.b break_mode
beq.b no_break_mode
move.l vbr_reg,a0
move.l $10(a0),illegal_except
lea.l break_reach,a2
move.l a2,$10(a0)
no_break_mode movem.l (a7)+,d0-d2/a0-a2
rts
;-------------- remove all breakpoints from mem. -----
clear_break movem.l a0-a1,-(a7)
lea.l break_list,a0
do_clr_BP tst.l (a0)
bmi.w end_clear_BPa
bne.b ok_clr_BP
cmp.w #-1,4(a0)
beq.b no_clr_BP
ok_clr_BP move.l (a0),a1
move.w 4(a0),(a1)
cmp.l #-1,6(a0)
beq.b no_clr_BP
move.l 6(a0),2(a1)
no_clr_BP lea.l 10(a0),a0
bra.b do_clr_BP
end_clear_BPa movem.l (a7)+,a0-a1
rts
;----------------------------------------------
break_reach movem.l a0-a1/a5,-(a7)
move.l 2+12(a7),a0 ;fetch PC
sf BP_reach
lea.l break_list,a1
seek_BP_reach tst.l (a1)
bmi.b break_not_found
bne.b do_check_BP
cmp.w #-1,4(a1)
beq.b no_check_BP
do_check_BP cmp.l (a1),a0
beq.b found_break
no_check_BP lea.l 10(a1),a1
bra.b seek_BP_reach
found_break move.w 4(a1),(a0) ;restore old instr.
clr.l (a1)
move.w #-1,4(a1) ;clear old BP
move.l a0,Break_Address
st BP_reach
movem.l (a7)+,a0-a1/a5
bra monitor ;enter monitor
break_not_found movem.l (a7)+,a0-a1/a5
move.l illegal_except,-(a7)
rts ;jmp old illegal
;----------------------------------------------------------
JSR_reach movem.l a2,-(a7)
lea.l JB_save,a2
movem.l a0-a1,(a2)
movem.l (a7)+,a2
movem.l (a7)+,a0
lea.l Break_Address,a1
move.l a0,(a1)
move.l $80.w,a1
lea.l JB_sup(pc),a0
move.l a0,$80.w
trap #0
JB_sup move.l a1,$80.w
move.l Break_Address,a0 ;fetch break_address
subq.l #6,a0 ;sub len jsr address
lea.l BPJ_reach,a1
sf (a1)
lea.l break_list,a1
seek_BPJ_reach tst.l (a1)
bmi.b bj_not_found
bne.b do_check_BPJ
cmp.w #-1,4(a1)
beq.b no_check_BPJ
do_check_BPJ cmp.l (a1),a0
beq.b found_breakJ
no_check_BPJ lea.l 10(a1),a1
bra.b seek_BPJ_reach
found_breakJ move.w 4(a1),(a0) ;restore old instr.
move.l 6(a1),2(a0)
clr.l (a1)
move.w #-1,4(a1) ;clear old BP
move.l #-1,6(a1)
move.l a0,Break_Address
st BPJ_reach
movem.l JB_save,a0-a1
move.l Break_Address,2(a7)
bra.w monitor ;enter monitor
bj_not_found move.l Break_Address,2(a7)
movem.l JB_save,a0-a1
rte
;--------------------------------------------------
print_break lea.l break_list,a1
moveq #8,d1
do_break_all tst.l (a1)
bmi.b end_break_all
bne.b ok_break_all
cmp.w #-1,4(a1)
beq.b no_break_all
ok_break_all tst.l 6(a1)
bmi.b no_Bjsr_prt
move.l (a1),d0
lea.l all_break2_txt,a0
bra.b ok_Bjsr_prt
no_Bjsr_prt move.l (a1),d0
lea.l all_break_txt,a0
ok_Bjsr_prt bsr print
bsr print_hexCR
no_break_all lea.l 10(a1),a1
bra.b do_break_all
end_break_all bra.w end_command
***************************************************
;-------------- disassemble (D) -------------------
cmd_d: move.b (a0)+,d0
beq.b ok_d_cmd ;keep last address
cmp.b #$20,d0
beq.b cmd_d
subq.l #1,a0
bsr evaluate
bne.w illegal_addr
btst #0,d0 ;address must be even
bne.w illegal_addr
move.l d0,dis_ptr
ok_d_cmd move.l dis_ptr,d0 ;a4 = ptr on memory
and.w #$fffe,d0 ;even addr.
move.l d0,a4
moveq #8-1,d7
next_dis_line
move.l a4,-(a7)
bsr corr_addr
lea.l general_txt,a0
moveq #7,d0 ;upper case, d $address
bsr disassemble
move.l (a7)+,a4
add.w d0,a4 ;add instr len
lea.l general_txt,a0
bsr print
tst.b break
dbne d7,next_dis_line
move.l a4,dis_ptr
bra.w end_command
;-------------- scroll up disassemble --------
cmdu_d move.l ascII_ptr,a0
lea.l 80(a0),a0
cmp.w #'D ',(a0) ;last top line was a disassemble ?
bne.w .nod
addq.l #2,a0
bsr evaluate ;get last address
move.l d0,d6 ;d6=address of next instr.
move.l d0,d5
sub.l #20,d5 ;d5=address to test
.loop move.l d5,a4
bsr corr_addr
moveq #7,d0
lea.l general_txt,a0
bsr disassemble
add.l d5,d0
cmp.l d0,d6 ;right len of instr ?
beq.b .ok
move.l d0,d5
cmp.l d6,d5 ;reach end of area to test
blt.b .loop
;---- couldn't find an instr. with the right length -> print 'dc.w'
lea.l general_txt,a0
move.w #"D ",(a0)+
move.b #"$",(a0)+
move.l d6,d0
subq.l #2,d0
moveq #8,d1
bsr conv_hex
add.l d1,a0
move.b #" ",(a0)+
move.l #"Dc.W",(a0)+
move.w #" $",(a0)+
move.l d6,a4
bsr corr_addr
move.w (a4),d0
moveq #4,d1
bsr conv_hex
add.l d1,a0
move.w #$0a00,(a0)+
bra.w .ok
.ok move.l d5,d0
lea.l general_txt,a0
bsr print
subq.w #1,(2,a3) ;cursor one line up
moveq #0,d0
.nod rts
.bad_addr lea.l illegal_addr_txt,a0
bsr print
bra.b .nod
;-------------- scroll down disassemble ---------
cmdd_d move.l ascII_ptr,a0
move.l d0,-(a7)
move.w window_bot,d0
subq.w #2,d0
mulu #80,d0
add.l d0,a0
move.l (a7)+,d0
cmp.w #'D ',(a0) ;last line was a disassemble ?
bne.b .nod
addq.l #2,a0
bsr evaluate ;get last address
move.l d0,d6
move.l d0,a4
bsr corr_addr
moveq #0,d0
lea.l general_txt,a0
bsr disassemble ;calc last instr size
add.l d6,d0
move.l d0,a4
move.l d0,d6
bsr corr_addr
moveq #7,d0
lea.l general_txt,a0
bsr disassemble
add.l d0,d6 ;add instr. size
move.l d6,dis_ptr ;next instr. address
subq.w #1,(2,a3) ;cursor one line up
lea.l general_txt,a0
bsr print
moveq #0,d0
.nod rts
include src/65816.s
***********************************************************
;-------------- error routines ---------------------
illegal_syntax lea.l illegal_syntax_txt,a0
bsr print
bra.w end_command
illegal_val lea.l illegal_val_txt,a0
bsr print
bra.w end_command
illegal_reg lea.l illegal_reg_txt,a0
bsr print
bra.w end_command
illegal_addr lea.l illegal_addr_txt,a0
bsr print
bra.w end_command
illegal_name lea.l illegal_name_txt,a0
bsr print
bra.w end_command
illegal_string lea.l illegal_string_txt,a0
bsr print
bra.w end_command
illegal_expr lea.l illegal_expr_txt,a0
bsr print
bra.w end_command
too_break lea.l too_break_txt,a0
bsr print
bra.w end_command
not_found lea.l not_found_txt,a0
bsr print
bra.w end_command
*********************************************************
;d0=ascII
upper_case: cmp.b #'a',d0 ;switch to upper case (d0)
blt.b .ok_upper
cmp.b #'z',d0
bgt.b .ok_upper
add.b #'A'-'a',d0
.ok_upper rts
;d0=ascII
lower_case cmp.b #'A',d0 ;switch to lower case (d0)
blt.b .ok_lower
cmp.b #'Z',d0
bgt.b .ok_lower
add.b #'a'-'A',d0
.ok_lower rts
;d1=ascII
upper_case1 cmp.b #'a',d1 ;switch to upper case (d1)
blt.b .ok_upper
cmp.b #'z',d1
bgt.b .ok_upper
add.b #'A'-'a',d1
.ok_upper rts
************************************************************
;read string at a0 and copy it in a1 (0=end of string)
;' ' can surround a string
read_name movem.l d0/a1,-(a7)
.loop cmp.b #$20,(a0)+
beq.b .loop
subq.l #1,a0
cmp.b #"'",(a0)
bne.b .colle
addq.l #1,a0
.loop2 move.b (a0)+,d0
beq.b .err
cmp.b #"'",d0
bne.b .g1
cmp.b #"'",(a0)
bne.b .end_n
addq.l #1,a0
.g1 move.b d0,(a1)+
bra.b .loop2
.end_n clr.b (a1)+
movem.l (a7)+,d0/a1
rts
.colle move.b (a0)+,d0
beq.b .err
cmp.b #$20,d0
beq.b .end_n
move.b d0,(a1)+
bra.b .colle
.err movem.l (a7)+,d0/a1
clr.b (a1)
rts
*************************************************************
;-> a0=ptr on ascII number
;<- returns number in d0
read_number movem.l d1-d3/a1,-(a7)
.spc cmp.b #$20,(a0)+
beq.b .spc
subq.l #1,a0
st ok_numb
sf minus
cmp.b #'-',(a0)
bne.b .no_minus
st minus
addq.l #1,a0
.no_minus moveq #0,d2
moveq #0,d0
cmp.b #'#',(a0)
bne.b no_dec_num
addq.l #1,a0 ;jmp #
next_dec move.b (a0)+,d0
cmp.b #'0',d0
blt.w end_number
cmp.b #'9',d0
bgt.w end_number
sub.b #'0',d0
add.l d2,d2
move.l d2,d3
lsl.l #2,d2
add.l d3,d2 ;mulu #10,d2
add.l d0,d2
sf ok_numb
bra.b next_dec
;-------------- read binary number ------------------
no_dec_num cmp.b #'%',(a0)
bne.b no_bin_num
addq.l #1,a0
moveq #0,d2
.loop move.b (a0)+,d0
sub.b #'0',d0
bmi.w end_number
cmp.b #1,d0
bgt.w end_number
add.l d2,d2
or.b d0,d2
sf ok_numb
bra.b .loop
no_bin_num cmp.b #"'",(a0)
bne.b no_ascII_num
addq.l #1,a0
moveq #0,d2
.loop move.b (a0)+,d0
beq.w end_number
cmp.b #"'",d0
bne.b .no_end_ascII
cmp.b #"'",(a0)
bne.b end_ascII_num
addq.l #1,a0
.no_end_ascII lsl.l #8,d2
move.b d0,d2
bra.b .loop
end_ascII_num addq.l #1,a0
sf ok_numb
bra.w end_number
;-------------- read hexa number + label --------------------
no_ascII_num move.l a0,a1
tst.b label ;test if label enabled
bne.b .no_label
bsr check_label
tst.l d0
beq.b .no_label
sf ok_numb
move.l a4,-(a7)
move.l d0,a4
bsr corr_addr
move.l (a4),d2
move.l (a7)+,a4
addq.l #1,a0
bra.b end_number
.no_label move.l a1,a0
cmp.b #'$',(a0) ;jmp $ for hex number
bne.w next_dec
addq.l #1,a0 ;jmp $
.ok_dollar lea.l hex_list,a1
next_hex
move.b (a0)+,d0
bsr upper_case
moveq #$f,d1
seek_hex cmp.b (a1,d1.w),d0
dbeq d1,seek_hex
tst.w d1
bmi.b end_number
lsl.l #4,d2
or.w d1,d2
sf ok_numb
bra.b next_hex
end_number subq.l #1,a0
move.l d2,d0
tst.b minus
beq.b .no_minus
neg.l d0
.no_minus tst.b ok_numb ;test if error
movem.l (a7)+,d1-d3/a1
rts
check_label movem.l d1-d3/a1-a4,-(a7)
move.l a0,d3
lea.l label_list,a1
moveq #0,d2
.main tst.b (a1)
beq.b .end_list
move.l a0,a2
move.l a1,a3
moveq #8-1,d1
.do_cmp move.b (a2)+,d0
bsr upper_case
cmp.b (a3)+,d0
bne.b .no_egal
tst.b (a3)
dbeq d1,.do_cmp
move.l 8(a1),d2
move.l a2,a4
.no_egal lea.l 8+4(a1),a1
bra.b .main
.end_list move.l a4,a0 ;get end of label
move.b (a0),d0
beq.b .ok_label
bsr upper_case
lea.l .symb_list,a1
.seek cmp.b (a1)+,d0
beq.b .ok_label
tst.b (a1)
bne.b .seek
moveq #0,d2
move.l d3,a0
.ok_label move.l d2,d0
movem.l (a7)+,d1-d3/a1-a4
rts
;list of symbols which can follow a label.
.symb_list dc.b $a,' ','+','-','*','/','&','|',')','.',']',0
cnop 0,4
label_list
dc.b "D0",0,0,0,0,0,0
dc.l registres
dc.b "D1",0,0,0,0,0,0
dc.l registres+4
dc.b "D2",0,0,0,0,0,0
dc.l registres+2*4
dc.b "D3",0,0,0,0,0,0
dc.l registres+3*4
dc.b "D4",0,0,0,0,0,0
dc.l registres+4*4
dc.b "D5",0,0,0,0,0,0
dc.l registres+5*4
dc.b "D6",0,0,0,0,0,0
dc.l registres+6*4
dc.b "D7",0,0,0,0,0,0
dc.l registres+7*4
dc.b "A0",0,0,0,0,0,0
dc.l registres+8*4
dc.b "A1",0,0,0,0,0,0
dc.l registres+9*4
dc.b "A2",0,0,0,0,0,0
dc.l registres+10*4
dc.b "A3",0,0,0,0,0,0
dc.l registres+11*4
dc.b "A4",0,0,0,0,0,0
dc.l registres+12*4
dc.b "A5",0,0,0,0,0,0
dc.l registres+13*4
dc.b "A6",0,0,0,0,0,0
dc.l registres+14*4
dc.b "A7",0,0,0,0,0,0
dc.l registres+15*4
dc.b "PC",0,0,0,0,0,0
dc.l pc_reg
dc.b "VBR",0,0,0,0,0
dc.l vbr_reg
dc.b "CACR",0,0,0,0
dc.l cacr_reg
dc.b "CAAR",0,0,0,0
dc.l caar_reg
dc.b "PCR",0,0,0,0,0
dc.l msp_reg
dc.b "BUSR",0,0,0,0
dc.l caar_reg
dc.b "ISP",0,0,0,0,0
dc.l isp_reg
dc.b "MSP",0,0,0,0,0
dc.l msp_reg
dc.b "EXEC",0,0,0,0
dc.l $4
dc.b "LEV3",0,0,0,0
dc.l $6c
dc.b 0
cnop 0,4
************************************************************
read_fact cmp.b #'(',(a0)
bne.b .no_parg
addq.l #1,a0
bsr.w read_expr
cmp.b #')',(a0)+
bne.w eval_error
bra.b end_fact
.no_parg cmp.b #'[',(a0)
bne.b .no_cro
addq.l #1,a0
bsr.w read_expr
cmp.b #']',(a0)+
bne.w eval_error
move.l d0,a4
bsr corr_addr
move.l (a4),d0
bra.b end_fact
.no_cro bsr read_number
bne.w eval_error
end_fact cmp.b #'.',(a0)
bne.b .no_size
addq.l #1,a0 ;jmp .
move.l d1,-(a7)
move.b (a0)+,d1
bsr upper_case1
cmp.b #'B',d1
bne.b .no_b
ext.w d0
ext.l d0
clr.w eval_size
bra.b .end_size
.no_b cmp.b #'W',d1
bne.b .no_w
ext.l d0
move.w #1,eval_size
bra.b .end_size
.no_w cmp.b #'L',d1
bne.w eval_error
move.w #3,eval_size
.end_size move.l (a7)+,d1
.no_size rts
read_terme move.l d1,-(a7)
bsr.w read_fact
move.l d0,d1
.loop cmp.b #'*',(a0)
bne.b .no_fois
addq.l #1,a0
bsr.w read_fact
bsr.w muls32
bra.b .loop
.no_fois cmp.b #'/',(a0)
bne.b .no_div
addq.l #1,a0
bsr.w read_fact
bsr.w divs32
bra.b .loop
.no_div move.l d1,d0
move.l (a7)+,d1
rts
read_expr move.l d1,-(a7)
cmp.b #'+',(a0)
bne.b .no_p
addq.l #1,a0
.no_p cmp.b #'-',(a0)
bne.b .no_m
addq.l #1,a0
bsr.b read_terme
neg.l d0
bra.b .ok_m
.no_m bsr.b read_terme
.ok_m move.l d0,d1
.loop cmp.b #'+',(a0)
bne.b .no_plus
addq.l #1,a0
bsr.b read_terme
add.l d0,d1
bra.b .loop
.no_plus cmp.b #'-',(a0)
bne.b .no_moins
addq.l #1,a0
bsr.b read_terme
sub.l d0,d1
bra.b .loop
.no_moins move.l d1,d0
move.l (a7)+,d1
rts
;-> a0 =ptr on expr
;<- d0 value
;<- flag: zero=ok, negative=error, positive=no number
evaluate: move.l a7,exit_stack
.loop cmp.b #$20,(a0)+
beq.b .loop
subq.l #1,a0
tst.b (a0)
beq.b .no_eval
bsr read_expr
tst.b ok ;zero = ok
rts
.no_eval tst.b ok2
rts
eval_error move.l exit_stack,a7
moveq #-1,d0 ;neg val = error
rts
ok dc.b 0
ok2 dc.b 1 ;positive val = no number
;d0.l,d1.l
;d1.l=d0.l*d1.l
muls32 movem.l d0/d2/a0,-(a7)
lea.l muls_data,a0
movem.l d0-d1,(a0)
swap d0
mulu d0,d1
move.w d1,d2
movem.l (a0),d0-d1
swap d1
mulu d0,d1
add.w d1,d2
swap d2
clr.w d2
movem.l (a0),d0-d1
mulu d0,d1
add.l d2,d1
movem.l (a7)+,d0/d2/a0
rts
;d0.l,d1.l
;d1.l=d1.l/d0.l
divs32 movem.l d0/d2-d4/a0,-(a7)
exg d0,d1
sf d4
tst.l d0
bpl.b .n1
neg.l d0
not.b d4
.n1 tst.l d1
bpl.b .n2
neg.l d1
not.b d4
.n2 move.l #$ffff,d3
lea.l divs_data,a0
movem.l d0-d1,(a0)
moveq #0,d2
cmp.l #$10000,d1
bge.b .div2
tst.w d1
beq.w eval_error
swap d0
and.l d3,d0
divu d1,d0
move.w d0,d2
swap d2
clr.w d2
move.w 2(a0),d0
divu d1,d0
and.l d3,d0
add.l d0,d2
bra.b .ok1
.div2 lsr.l #1,d0
lsr.l #1,d1
cmp.l #$10000,d1
bge.b .div2
tst.w d1
beq.w eval_error
divu d1,d0
move.w d0,d2
and.l d3,d2
.ok1 tst.b d4
beq.b .n3
neg.l d2
.n3 move.l d2,d1
movem.l (a7)+,d0/d2-d4/a0
rts
************************************************************
;-> a0=ptr on ascII registre
;<- returns no of registre in d0 and end of ascII reg in a0
read_reg movem.l d1-d3/a1-a4,-(a7)
move.l a0,d3
lea.l reg_table,a1
moveq #-1,d2
.main tst.b (a1)
beq.b .end_list
move.l a0,a2
move.l a1,a3
moveq #4-1,d1
.do_cmp move.b (a2)+,d0
bsr upper_case
cmp.b (a3)+,d0
bne.b .no_egal
tst.b (a3)
dbeq d1,.do_cmp
move.w 4(a1),d2
move.l a2,a4
.no_egal lea.l 4+2(a1),a1
bra.b .main
.end_list move.l a4,a0 ;get end of register
move.w d2,d0
movem.l (a7)+,d1-d3/a1-a4
rts
reg_table
dc.b "D0",0,0
dc.w 0
dc.b "D1",0,0
dc.w 1
dc.b "D2",0,0
dc.w 2
dc.b "D3",0,0
dc.w 3
dc.b "D4",0,0
dc.w 4
dc.b "D5",0,0
dc.w 5
dc.b "D6",0,0
dc.w 6
dc.b "D7",0,0
dc.w 7
dc.b "A0",0,0
dc.w 8
dc.b "A1",0,0
dc.w 9
dc.b "A2",0,0
dc.w 10
dc.b "A3",0,0
dc.w 11
dc.b "A4",0,0
dc.w 12
dc.b "A5",0,0
dc.w 13
dc.b "A6",0,0
dc.w 14
dc.b "A7",0,0
dc.w 15
dc.b "PC",0,0
dc.w 16
dc.b "SR",0,0
dc.w 17
dc.b "VBR",0
dc.w 18
dc.b "USP",0
dc.w 19
dc.b "SSP",0
dc.w 20
dc.b "CACR"
dc.w 21
dc.b "PCR",0
dc.w 22
dc.b "BUSR"
dc.w 23
dc.w 0
************************************************************
;-------------- Run-length packing -------------------------
;-> a0=ptr on source mem to pack
;-> a1=destination mem
;-> d0.w=size to pack
;<- d0.w=packed size
pack movem.l d1-d6/a0-a4,-(a7)
move.w #$100,$dff096 ;disable bitplan DMA
move.w #0,$dff106
move.l a1,a4
lea.l 8(a4),a2
move.l d0,4(a4)
move.l a0,a3
move.l d0,d3 ;d3=original size
move.l d0,d5 ;d5=nb of bytes still to pack
.loop move.l d5,d6
cmp.l #128,d6
ble.b .min
moveq #127,d6
addq.l #1,d6 ;d6=128
.min
move.l d6,d0
subq.l #1,d0 ;d6=1 ?
bne.b .no1
move.b (a0)+,(a2)+
sf (a2)+
bra.b .end
.no1
move.b (a0)+,d0
move.b d0,$dff180
move.b (a0)+,d1
cmp.b d0,d1
bne.b .diff
moveq #1,d4
subq.l #1,d6
.cntsame addq.l #1,d4
subq.l #1,d6
beq.b .out2
cmp.b (a0)+,d0
beq.b .cntsame
subq.l #1,a0
.out2
sub.l d4,d5
neg.w d4
move.b d0,(a2)+
move.b d4,(a2)+
tst.l d5
beq.b .end
bra.b .loop
;---------------------------------
.diff lea.l -2(a0),a1
moveq #0,d4
.cntdiff move.b d1,d0
addq.l #1,d4
subq.l #1,d6
beq.b .out
move.b (a0)+,d1
cmp.b d0,d1
bne.b .cntdiff
subq.l #1,a0
.out subq.l #1,a0
sub.l d4,d5
subq.l #1,d4
move.w d4,d0
.copy move.b (a1)+,(a2)+
dbf d4,.copy
move.b d0,(a2)+
tst.l d5 ;end of block ?
bne.b .loop
.end move.l a2,d0
lea.l 8(a4),a1
sub.l a1,d0 ;d0=packed size
move.l d0,(a4) ;first long=packed size
cmp.l d0,d3
bgt.b .pack
lea.l 8(a4),a1
move.l d3,d0
neg.l d0
move.l d0,(a4)
move.l d3,d0
move.b d3,d1
lsr.l #2,d3
.copyl move.l (a3)+,(a1)+ ;copy unpacked area
subq.l #1,d3
bne.b .copyl
and.w #3,d1
bra.b .godbf
.copyb move.b (a3)+,(a1)+
.godbf dbf d1,.copyb
.pack
addq.l #8,d0 ;for first long=size
move.w #0,$dff106
move.w #0,$dff180
move.w #$8100,$dff096 ;enable bitplan DMA
movem.l (a7)+,d1-d6/a0-a4
rts
;----------------------------------------------------------
;-> a0=ptr on packed mem
;-> a1=ptr on dest mem
depack movem.l d0-d1/a0-a2,-(a7)
move.w #0,$dff106
move.w #$100,$dff096 ;disable bitplan DMA
tst.l (a0)
bmi.b .nopack
movem.l (a0)+,d0-d1
move.l a0,a2
add.l d0,a0
add.l d1,a1
.loop cmp.l a2,a0
beq.b .end
moveq #0,d0
move.b -(a0),d0
bmi.b .neg
.copy move.b -(a0),-(a1)
dbf d0,.copy
move.b (a1),$dff180
bra.b .loop
.neg ext.w d0
not.w d0
move.b -(a0),d1
move.b d1,$dff180
.fill move.b d1,-(a1)
dbf d0,.fill
bra.b .loop
.nopack addq.l #8,a0
move.l 4(a0),d0
move.b d0,d1
lsr.l #2,d0
.copyl move.l (a0)+,(a1)+
subq.l #1,d0
bne.b .copyl
and.w #3,d1
bra.b .godbf
.copyb move.b (a0)+,(a1)+
.godbf dbf d1,.copyb
.end
move.w #0,$dff106
move.w #0,$dff180
move.w #$8100,$dff096 ;enable bitplan DMA
movem.l (a7)+,d0-d1/a0-a2
rts
************************************************************
;a0=ptr on text
print_curs bsr clear_cursor ;special print which clears cursor
clr.w cursor_x ;and set it to x=0
bsr.b print
bsr set_cursor
rts
print: movem.l d0-d2/a0-a4,-(a7)
move.l output_ptr,d0
beq.b .noout
move.l a0,a1
move.l d0,a2
.copy move.b (a1)+,(a2)+
bne.b .copy
subq.l #1,a2
move.l a2,output_ptr
; move.l a2,watch2
.noout move.w window_bot,d2
lea.l cursor_x,a3
move.w 2(a3),d0
cmp.w window_top,d0
bge.b .ok1
move.w window_top,d0
.ok1 cmp.w window_bot,d0
blt.b .ok2
move.w window_bot,d0
.ok2 move.w d0,2(a3)
move.l ascII_ptr,a2
lea.l print_cnt,a4
clr.w (a4)
print_next
go_print tst.b break
bne.w end_print
move.w 2(a3),d0
mulu #80,d0
lea.l (a2,d0.l),a1
add.w (a3),a1
move.b (a0)+,d0
beq.b end_printl
cmp.b #$0a,d0
beq.b end_printl
cmp.b #9,d0
bne.b .no_tab
move.w (a3),d0
and.w #$fff8,d0
addq.w #8,d0
move.w d0,(a3)
bra.b go_print
.no_tab cmp.b #$0d,d0
bne.b .no_13
clr.w (a3)
bra.b go_print
.no_13 move.b d0,(a1)
addq.w #1,(a3)
cmp.w #80,(a3)
blt.b .ok
clr.w (a3)
move.w 2(a3),d0
bsr print_line
addq.w #1,(a4)
cmp.w (a4),d2
bgt.b .okp
bsr.b print_wait
.okp cmp.w 2(a3),d2
bgt.b .ok_cr_prt
subq.w #1,2(a3)
bsr scroll_up
.ok_cr_prt addq.w #1,2(a3)
.ok
bra.b go_print
end_printl tst.b d0
beq.b end_print
;-------------- print CR -------------------
move.w 2(a3),d0
bsr print_line
addq.w #1,(a4)
cmp.w (a4),d2
bgt.b .okp
bsr.b print_wait
.okp clr.w (a3)
cmp.w 2(a3),d2
bgt.b .ok_cr_prt
subq.w #1,2(a3)
bsr scroll_up
.ok_cr_prt addq.w #1,2(a3)
tst.b (a0)
beq.b end_print_out
bra.w print_next
;-------------------------------------------
end_print move.w 2(a3),d0
bsr print_line
end_print_out
movem.l (a7)+,d0-d2/a0-a4
rts
print_wait tst.b no_print
bne.b .nowait
clr.w (a4)
st new_key
.wait move.w #15,time_cursor
tst.b new_key
bne.b .wait
.nowait rts
************************************************************
no_sc_clr dc.b 0
even
scroll_up move.l d2,-(a7)
moveq #1,d2
bsr.b scroll_up2
move.l (a7)+,d2
rts
;-> d2 = nb of lines
scroll_up2 movem.l d0-d1/a0-a1,-(a7)
move.l ascII_ptr,a0
move.w window_top,d0
mulu #80,d0
add.l d0,a0
move.w d2,d0
mulu #80,d0
lea.l (a0,d0.l),a1
move.w window_bot,d0
sub.w window_top,d0
sub.w d2,d0
addq.w #1,d0
bra.b .go_dbf
.ascII_up move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
.go_dbf dbf d0,.ascII_up
move.l #' ',d0
moveq #5,d1
mulu d2,d1
subq.w #1,d1
.clear_up move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
dbf d1,.clear_up
tst.b no_print
bne.w .noscroll
move.l pic_ptr,a0
move.w window_top,d0
mulu #80*h,d0
add.l d0,a0
move.w d2,d0
mulu #80*h,d0
lea.l (a0,d0.l),a1
move.w window_bot,d0
sub.w window_top,d0
sub.w d2,d0
addq.w #1,d0
mulu #h,d0
bra.b .go_dbf2
.pixel_up move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
.go_dbf2 dbf d0,.pixel_up
moveq #0,d0
tst.b no_sc_clr
beq.b .goclr
move.w d2,d1
subq.w #1,d1
mulu #80*h,d1
add.l d1,a0
moveq #5*h-1,d1
bra.b .clear_pix_up
.goclr move.w d2,d1
mulu #5*h,d1
subq.w #1,d1
.clear_pix_up move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
dbf d1,.clear_pix_up
.noscroll movem.l (a7)+,d0-d1/a0-a1
rts
;-------------------------------------------
scroll_down move.l d2,-(a7)
moveq #1,d2
bsr.b scroll_down2
move.l (a7)+,d2
rts
;-> d2 = nb of lines
scroll_down2 movem.l d0-d1/a0-a1,-(a7)
move.l ascII_ptr,a0
move.w window_bot,d0
mulu #80,d0
add.l d0,a0
move.l a0,a1
move.w d2,d0
subq.w #1,d0
mulu #80,d0
sub.l d0,a1
lea.l 80(a0),a0
move.w window_bot,d0
sub.w window_top,d0
sub.w d2,d0
addq.w #1,d0
bra.b .go_dbf
.ascII_down move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
.go_dbf dbf d0,.ascII_down
move.l #' ',d0
move.w d2,d1
mulu #5,d1
subq.w #1,d1
.clear_down move.l d0,-(a0)
move.l d0,-(a0)
move.l d0,-(a0)
move.l d0,-(a0)
dbf d1,.clear_down
tst.b no_print
bne.w .noscroll
move.l pic_ptr,a0
move.w window_bot,d0
mulu #80*h,d0
add.l d0,a0
move.l a0,a1
move.w d2,d0
subq.w #1,d0
mulu #80*h,d0
sub.l d0,a1
lea.l 80*h(a0),a0
move.w window_bot,d0
sub.w window_top,d0
sub.w d2,d0
addq.w #1,d0
mulu #h,d0
bra.b .go_dbf2
.pixel_down move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
move.l -(a1),-(a0)
.go_dbf2 dbf d0,.pixel_down
moveq #0,d0
tst.b no_sc_clr
beq.b .goclr
move.w d2,d1
subq.w #1,d1
mulu #80*h,d1
sub.l d1,a0
moveq #5*h-1,d1
bra.b .clear_pix_down
.goclr move.w d2,d1
mulu #5*h,d1
subq.w #1,d1
.clear_pix_down move.l d0,-(a0)
move.l d0,-(a0)
move.l d0,-(a0)
move.l d0,-(a0)
dbf d1,.clear_pix_down
.noscroll movem.l (a7)+,d0-d1/a0-a1
rts
************************************************************
;d0=no of line
print_line movem.l d0-d4/a0-a4,-(a7)
tst.b no_print
bne.w .no_print
move.l ascII_ptr,a0
mulu #80,d0
add.l d0,a0
move.l pic_ptr,a1
mulu #h,d0
add.l d0,a1
lea.l topaz2,a3
lea.l ascII_conv,a4
moveq #80-1,d4
moveq #0,d2
moveq #0,d0
.do_line_prt move.b (a0)+,d2
move.b (a4,d2.w),d0
lea.l (a3,d0.w),a2
move.b 110(a2),80(a1)
move.b 220(a2),160(a1)
move.b 330(a2),240(a1)
move.b 440(a2),320(a1)
move.b 550(a2),400(a1)
move.b 660(a2),480(a1)
move.b 770(a2),560(a1)
move.b 880(a2),640(a1)
move.b (a2),(a1)+
dbf d4,.do_line_prt
.stop_print move.w #15,time_cursor
btst #10-8,$dff016
beq.b .stop_print
.no_print movem.l (a7)+,d0-d4/a0-a4
rts
;---------------------------------------------------
;d0=x pos
;d1=y pos
;d2=ascII char
print_char movem.l d0-d2/a1-a2,-(a7)
move.l ascII_ptr,a1
add.w d0,a1
lsl.w #4,d1
move.w d1,a2
add.w d1,d1
add.w d1,d1
add.w a2,d1 ;d1*80
move.b d2,(a1,d1.w)
and.w #$ff,d2
lea.l ascII_conv,a2
move.b (a2,d2.w),d2
lea.l topaz2,a2
lea.l (a2,d2.w),a2
move.l pic_ptr,a1
add.w d0,a1
mulu #h,d1
add.l d1,a1
move.b (a2),(a1)
move.b 110(a2),80(a1)
move.b 220(a2),160(a1)
move.b 330(a2),240(a1)
move.b 440(a2),320(a1)
move.b 550(a2),400(a1)
move.b 660(a2),480(a1)
move.b 770(a2),560(a1)
move.b 880(a2),640(a1)
movem.l (a7)+,d0-d2/a1-a2
rts
;d0=x pos
;d1=y pos
;d2=ascII char
;print on all screens
print_char2 movem.l d0-d2/a1-a3,-(a7)
lsl.w #4,d1
move.w d1,a2
add.w d1,d1
add.w d1,d1
add.w a2,d1 ;d1*80
add.w d0,d1
lea.l ascII_ptr+4,a1
.loop tst.l (a1)
beq.b .end_ascII
move.l (a1)+,a3
move.b d2,(a3,d1.w)
bra.b .loop
.end_ascII and.w #$ff,d2
lea.l ascII_conv,a2
move.b (a2,d2.w),d2
lea.l topaz2,a2
lea.l (a2,d2.w),a2
sub.w d0,d1
move.l pic_ptr,a1
add.w d0,a1
mulu #h,d1
add.l d1,a1
move.b (a2),(a1)
move.b 110(a2),80(a1)
move.b 220(a2),160(a1)
move.b 330(a2),240(a1)
move.b 440(a2),320(a1)
move.b 550(a2),400(a1)
move.b 660(a2),480(a1)
move.b 770(a2),560(a1)
move.b 880(a2),640(a1)
movem.l (a7)+,d0-d2/a1-a3
rts
do_cursor: bsr clear_snap
tst.b no_curs
bne.w .no_cur
movem.l d0-a6,-(a7)
lea.l $dff000,a6
bsr init_mouse
move.w x_spr,d0
bpl.b .ok1
clr.w d0
.ok1 cmp.w #640,d0
blt.b .ok2
move.w #639,d0
.ok2 move.w d0,x_spr
lsr #3,d0
move.w d0,snap_x
move.w y_spr,d0
bpl.b .ok3
clr.w d0
.ok3 move.w screen_height,d1
mulu #9,d1
cmp.w d1,d0
blt.b .ok4
move.w d1,d0
subq.w #1,d0
.ok4 move.w d0,y_spr
ext.l d0
divu #9,d0
move.w d0,snap_y
bsr set_snap
tst.b nosnap
bne.w .nos
tst.b left
beq.w .noleft
move.l ascII_ptr,a0
move.w snap_y,d0
mulu #80,d0
add.l d0,a0
move.w snap_x,d0
cmp.b #$20,(a0,d0.w)
beq.b .noleft
.redeb tst.w d0
beq.b .debs
cmp.b #$20,-1(a0,d0.w)
beq.b .debs
cmp.b #';',-1(a0,d0.w)
beq.b .debs
cmp.b #'=',-1(a0,d0.w)
beq.b .debs
cmp.b #'(',-1(a0,d0.w)
beq.b .debs
cmp.b #',',-1(a0,d0.w)
beq.b .debs
subq.w #1,d0
bra.b .redeb
.debs
lea.l snap_buf,a1
.cops move.b (a0,d0.w),(a1)+
addq.w #1,d0
cmp.w #80,d0
beq.b .ends
cmp.b #',',(a0,d0.w)
beq.b .ends
cmp.b #';',(a0,d0.w)
beq.b .ends
cmp.b #')',(a0,d0.w)
beq.b .ends
cmp.b #$20,(a0,d0.w)
bne.b .cops
.ends sf (a1)
.noleft
.nos
movem.l (a7)+,d0-a6
subq.w #1,time_cursor
bpl.b no_cursor
sf nosnap
move.w #15,time_cursor
bsr.b set_cursor
.no_cur rts
set_cursor: movem.l d0/a0,-(a7)
move.l pic_ptr,a0
add.w cursor_x,a0
move.w cursor_y,d0
mulu #80*h,d0
add.l d0,a0
not.b cursor_on
tst.b no_print
bne.b .no
not.b (a0)
not.b 80(a0)
not.b 160(a0)
not.b 240(a0)
not.b 320(a0)
not.b 400(a0)
not.b 480(a0)
not.b 560(a0)
.no movem.l (a7)+,d0/a0
no_cursor rts
clear_cursor: movem.l d0/a0,-(a7)
st nosnap
bsr clear_snap
move.w #15,time_cursor
move.l pic_ptr,a0
add.w cursor_x,a0
move.w cursor_y,d0
mulu #80*h,d0
add.l d0,a0
tst.b cursor_on
beq.b no_clear_curs
tst.b no_print
bne.b .no
not.b (a0)
not.b 80(a0)
not.b 160(a0)
not.b 240(a0)
not.b 320(a0)
not.b 400(a0)
not.b 480(a0)
not.b 560(a0)
.no
no_clear_curs sf cursor_on
movem.l (a7)+,d0/a0
rts
snap_x: dc.w 40
snap_y: dc.w 10
snap_buf: dcb.b 84,0
snap: dc.b 0
nosnap: dc.b 0
even
clear_snap: movem.l d0-d2/a0,-(a7)
move.w sr,d2
move.w #$2700,sr
tst.b snap
beq.b .snapoff
sf snap
move.l pic_ptr,a0
add.w snap_x,a0
move.w snap_y,d0
mulu #80*h,d0
add.l d0,a0
move.b #$55,d0
move.b #$aa,d1
eor.b d0,(a0)
eor.b d1,80(a0)
eor.b d0,160(a0)
eor.b d1,240(a0)
eor.b d0,320(a0)
eor.b d1,400(a0)
eor.b d0,480(a0)
eor.b d1,560(a0)
.snapoff move.w d2,sr
movem.l (a7)+,d0-d2/a0
rts
set_snap: movem.l d0-d2/a0,-(a7)
tst.b nosnap
bne.b .nosnap
move.w sr,d2
move.w #$2700,sr
tst.b snap
bne.b .snapon
st snap
move.l pic_ptr,a0
add.w snap_x,a0
move.w snap_y,d0
mulu #80*h,d0
add.l d0,a0
move.b #$55,d0
move.b #$aa,d1
eor.b d0,(a0)
eor.b d1,80(a0)
eor.b d0,160(a0)
eor.b d1,240(a0)
eor.b d0,320(a0)
eor.b d1,400(a0)
eor.b d0,480(a0)
eor.b d1,560(a0)
.snapon move.w d2,sr
.nosnap movem.l (a7)+,d0-d2/a0
rts
;-------------- Print an hex number -------------------
;-> d0=hex number
;-> d1=nb ascIIs (length of hex number)
print_hex move.l a0,-(a7)
lea.l general_txt,a0
bsr.w conv_hex
sf (a0,d1.w) ;set end CHAR
bsr print
move.l (a7)+,a0
rts
;-------------- Print an hex number followed by a CR -
;-> d0=hex number
;-> d1=nb ascIIs (length of hex number)
print_hexCR move.l a0,-(a7)
lea.l general_txt,a0
bsr.b conv_hex
move.b #$a,(a0,d1.w) ;set CR CHAR
sf 1(a0,d1.w) ;set end CHAR
bsr print
move.l (a7)+,a0
rts
;-------------- Print a decimal number --------------------
;-> d0=dec number
;-> d1=nb ascIIs ;bit7=show zero
print_dec movem.l d0/a0,-(a7)
lea.l general_txt,a0
bsr.b conv_dec
lea.l general_txt,a0
and.w #$7f,d1
sf 1(a0,d1.w) ;set end CHAR
bsr print
movem.l (a7)+,d1/a0
rts
;-------------- Print a decimal number followed by a CR ---
;-> d0=dec number
;-> d1=nb ascIIs ;bit7=show zero
print_decCR movem.l d0/a0,-(a7)
lea.l general_txt,a0
bsr.b conv_dec
lea.l general_txt,a0
and.w #$7f,d1
move.b #$a,1(a0,d1.w) ;set CR CHAR
sf 2(a0,d1.w) ;set end CHAR
bsr print
movem.l (a7)+,d1/a0
rts
;-------------- Convert hex to ascII ------------------
;-> d0=hex number
;-> d1=nb ascIIs (length of hex number)
;-> a0=ptr on ascII destination buffer
conv_hex movem.l d0-d2/a1,-(a7)
and.w #$007f,d1 ;clear bit 7
lea.l hex_list,a1
subq.w #1,d1
.do_conv_hex move.w d0,d2
and.w #$f,d2
move.b (a1,d2.w),(a0,d1.w)
lsr.l #4,d0
dbf d1,.do_conv_hex
movem.l (a7)+,d0-d2/a1
rts
;-------------- Convert dec to ascII ------------------
;d0=dec number
;d1=nb ascIIs bit7=show zero
;a0=ptr on ascII buffer
conv_dec: movem.l d0-d4/a1,-(a7)
btst #7,d1
sne d3
and.w #$003f,d1
lea.l dec_list,a1
neg.w d1
add.w #10,d1
lsl.w #2,d1
add.w d1,a1
move.b #' ',d4
tst.l d0
bpl.b .no_minus
neg.l d0
move.b #'-',d4
.no_minus move.b #' ',(a0)+
move.l d0,d2
.next moveq #0,d0
move.l (a1)+,d1
beq.b .end_dec
.loop cmp.l d2,d1
bgt.b .ok_dix
sub.l d1,d2
addq.l #1,d0
bra.b .loop
.ok_dix subq.l #1,d1
bne.b .no_last
tst.b d3
bne.b .no_last
st d3
move.b d4,-1(a0)
.no_last tst.b d3
bne.b .no_first
st d3
tst.b d0
beq.b .empty
move.b d4,-1(a0)
bra.b .no_first
.empty sf d3
move.b #' ',d0
bra.b .ok_spc
.no_first cmp.b #9,d0
bls.b .ok_dec
moveq #0,d0
.ok_dec add.b #'0',d0
.ok_spc move.b d0,(a0)+
bra.b .next
.end_dec movem.l (a7)+,d0-d4/a1
rts
cnop 0,4
dec_list dc.l 1000000000
dc.l 100000000
dc.l 10000000
dc.l 1000000
dc.l 100000
dc.l 10000
dc.l 1000
dc.l 100
dc.l 10
dc.l 1
dc.l 0
**********************************************************
init_ascII movem.l d0-d2/a1-a3,-(a7)
lea.l ascII_conv,a1
move.w #256-1,d0
moveq #0,d1
loop_ia lea.l ascII,a2
move.w #end_ascII-ascII-1,d2
seek_ascII_i cmp.b (a2)+,d1
dbeq d2,seek_ascII_i
lea.l ascII+1,a3
sub.l a3,a2
move.w a2,d2
move.b d2,(a1)+
addq.w #1,d1
dbf d0,loop_ia
movem.l (a7)+,d0-d2/a1-a3
rts
**************************************************************************
;save DMA disk buffer to backup_dma
;-> a0=buffer chip address
save_buffer movem.l d0-d1/a0-a1,-(a7)
move.l a0,buffer
lea.l backup_pic+$100,a1
tst.b pic_status
beq.b .oklow
lea.l $100.w,a1
.oklow move.w #($1a00*2)/4-1,d1
.exg move.l (a0)+,(a1)+
dbf d1,.exg
movem.l (a7)+,d0-d1/a0-a1
rts
rest_buffer movem.l d0-d1/a0-a1,-(a7)
move.l buffer,a1
lea.l backup_pic+$100,a0
tst.b pic_status
beq.b .oklow
lea.l $100.w,a0
.oklow move.w #($1a00*2)/4-1,d1
.exg move.l (a0)+,(a1)+
dbf d1,.exg
movem.l (a7)+,d0-d1/a0-a1
rts
***********************************************************
;-------------- read a single sector from floppy disk -----
;-> d0=no of sector to read
;-> a0=address to copy sector into
read_fsector movem.l d0-d7/a0-a4,-(a7)
lea.l backup_pic+$100+$1a00*2,a1
tst.b pic_status
beq.b .golow
lea.l $100+$1a00*2,a1
st no_print
st small_pic
.golow move.l a1,track_buffer
move.l a0,a3
moveq #0,d2
move.w d0,d2
divu #11,d2 ;d2=track_no of sector to read
cmp.w track_buffer_no,d2 ;is track_buffer ok ?
bne.b .notsame
.okaccess lea.l track_sector,a0
move.l d2,d0
swap d0
tst.b (a0,d0.w) ;sector is in buffer ?
bne.b .notsame
mulu #512,d0 ;offset in track_buffer
move.l track_buffer,a0
add.l d0,a0
moveq #512/8-1,d0
.copysector move.l (a0)+,(a3)+
move.l (a0)+,(a3)+
dbf d0,.copysector
bra.b .okread
.notsame bsr write_flush
move.w d2,track_buffer_no
move.w d2,d0
mulu #11,d0
lea.l track_sector,a0
clr.l (a0)+ ;all sectors
clr.l (a0)+ ;are
clr.l (a0)+ ;loaded
move.l track_buffer,a0
moveq #11,d1 ;read 11 sectors (one track)
moveq #0,d7 ;read command
bsr access ;read the track in track_buffer
beq.b .okaccess ;no error ?
moveq #-1,d0
move.w d0,track_buffer_no ;an error occured
lea.l track_sector,a0
move.l d0,(a0)+ ;all sectors
move.l d0,(a0)+ ;are
move.l d0,(a0)+ ;NOT loaded
.okread tst.w drive_err
movem.l (a7)+,d0-d7/a0-a4
rts
;-------------- write a single sector to floppy disk ------
;-> d0=no of sector to write
;-> a0=address to copy sector from
write_fsector movem.l d0-d7/a0-a4,-(a7)
lea.l backup_pic+$100+$1a00*2,a1
tst.b pic_status
beq.b .golow
lea.l $100+$1a00*2,a1
st no_print
st small_pic
.golow move.l a1,track_buffer
move.l a0,a3
moveq #0,d2
move.w d0,d2
divu #11,d2 ;d2=track_no of sector to write
cmp.w track_buffer_no,d2 ;is track_buffer ok ?
beq.b .oksame
.notsame bsr.b write_flush
move.w d2,track_buffer_no
moveq #-1,d0
lea.l track_sector,a0
move.l d0,(a0)+ ;all sectors
move.l d0,(a0)+ ;are
move.l d0,(a0)+ ;NOT loaded
.oksame move.l d2,d0
swap d0
lea.l track_sector,a0
sf (a0,d0.w) ;set sector as loaded in buffer
mulu #512,d0
move.l track_buffer,a0
add.l d0,a0
moveq #512/8-1,d0
.copysector move.l (a3)+,(a0)+
move.l (a3)+,(a0)+
dbf d0,.copysector
st flush_needed
tst.w drive_err
movem.l (a7)+,d0-d7/a0-a4
rts
;-------------- flush write buffer for floppy disk --------
write_flush movem.l d0-d7/a0-a4,-(a7)
lea.l backup_pic+$100+$1a00*2,a1
tst.b pic_status
beq.b .golow
lea.l $100+$1a00*2,a1
st no_print
st small_pic
.golow move.l a1,track_buffer
tst.w track_buffer_no
bmi.w .noflush
tst.b flush_needed
beq.w .noflush
.recheck lea.l track_sector,a0
lea.l 11(a0),a1 ;end of sectors list
moveq #-1,d2
moveq #11-1,d0
.seek addq.l #1,d2
tst.b (a0)+
dbne d0,.seek
beq.b .goflush
moveq #0,d1 ;d1=nb sectors to read
subq.l #1,a0
.link sf (a0)+ ;set sector as loaded
addq.l #1,d1
cmp.l a1,a0
beq.b .okread
tst.b (a0)
bne.b .link
.okread cmp.w #11,d1
beq.b .noflush
move.l track_buffer,a0
move.w track_buffer_no,d0
mulu #11,d0
add.w d2,d0
mulu #512,d2
add.l d2,a0
moveq #0,d7 ;read command
bsr access
bne.b .error
bra.b .recheck
.goflush move.w track_buffer_no,d0
mulu #11,d0
move.l track_buffer,a0
moveq #11,d1 ;write 11 sectors (one track)
moveq #-1,d7 ;write command
bsr access
beq.b .noerr
.error moveq #-1,d0
move.w d0,track_buffer_no ;an error occured
lea.l track_sector,a0
move.l d0,(a0)+ ;all sectors
move.l d0,(a0)+ ;are
move.l d0,(a0)+ ;NOT loaded
.noerr
.noflush sf flush_needed
tst.w drive_err
movem.l (a7)+,d0-d7/a0-a4
rts
;-------------- write multiple sectors to floppy ----------
;-------------- exg pic memory and stop interrupts --------
;-> d0=first sector
;-> d1=nb of sector
;-> a0=address
write movem.l d0-d1/a0,-(a7)
tst.w d1
beq.b .nosave
bsr remove_pic
.loop bsr write_fsector
addq.w #1,d0
lea.l 512(a0),a0
subq.w #1,d1
bne.b .loop
bsr write_flush
bsr set_pic
.nosave tst.w drive_err
movem.l (a7)+,d0-d1/a0
rts
;-------------- read multiple sectors from floppy ---------
;-------------- exg pic memory and restore interrupts -----
;-> d0=first sector
;-> d1=nb of sector
;-> a0=address
read movem.l d0-d1/a0,-(a7)
tst.w d1
beq.b .noread
bsr remove_pic
.loop bsr read_fsector
addq.w #1,d0
lea.l 512(a0),a0
subq.w #1,d1
bne.b .loop
bsr set_pic
.noread tst.w drive_err
movem.l (a7)+,d0-d1/a0
rts
;-------------- write multiple sectors to floppy ----------
;-> d0=first sector
;-> d1=nb of sector
;-> a0=address
write2 movem.l d0-d1/a0,-(a7)
tst.w d1
beq.b .nosave
.loop bsr write_fsector
addq.w #1,d0
lea.l 512(a0),a0
subq.w #1,d1
bne.b .loop
bsr write_flush
.nosave tst.w drive_err
movem.l (a7)+,d0-d1/a0
rts
;-------------- read multiple sectors from floppy ---------
;-> d0=first sector
;-> d1=nb of sector
;-> a0=address
read2 movem.l d0-d1/a0,-(a7)
tst.w d1
beq.b .noread
.loop bsr read_fsector
addq.w #1,d0
lea.l 512(a0),a0
subq.w #1,d1
bne.b .loop
.noread tst.w drive_err
movem.l (a7)+,d0-d1/a0
rts
***********************************************
;d0.w=start sector (if write then d0 MUST be a multiple of 11)
;d1.w=nb sectors (if write then d1 MUST be a multiple of 11)
;d7: -1=write 0=read
;a0=address to load/save
;if d1=-1 & d7=-1 -> format whole disk
access: movem.l d0-a6,-(a7)
lea.l $dff000,a6
lea.l backup_pic+$100+$1a00*2,a1
tst.b pic_status
beq.b .golow
lea.l $100+$1a00*2,a1
st no_print
st small_pic
.golow move.l a1,track_buffer
ext.l d0
ext.l d1
move.l a0,a4 ;a4=address of actual sector
lea.l $40000,a0
bsr save_buffer
sf first_sauve
tst.w d1
smi format
bpl.b .no_format
moveq #0,d0
move.w #22*80,d1
lea.l track_sector,a0
moveq #-1,d5
move.l d5,(a0)+ ;all sectors
move.l d5,(a0)+ ;are NOT
move.l d5,(a0)+ ;loaded in track_buffer
move.w d5,track_buffer_no
.no_format
move.w d1,sectpos ;nb sectors to read/write
cmp.l #-1,d7 ;write requested ?
seq writes
ext.l d0
move.l d0,d5
divu #11,d5 ;d5.w = start_track
move.l d5,d0
swap d0
move.w d0,startsec ;nb sectors to skip in 1st track
lea.l $bfd100,a0
move.w #$8210,$96(a6)
move.w $10(a6),d0
or.w #$8000,d0
move.w d0,OldAdk
move.w #$7fff,$9e(a6)
move.w #$9100,$9e(a6)
tst.b writes
bne.b no_sync
move.w #$8400,$9e(a6)
no_sync: move.w #$4489,$7e(a6)
bsr motor_on ;turn drive motor ON
tst.w drive_err
bne.w fin
tst.b writes
beq.b .read
btst #3,$bfe001 ;test if write protected
bne.b .read
move.w #WRITEPROTECT_ERR,drive_err
bra.w fin
.read
bsr inittete ;init head pos (track 0) if needed
move.w drive,d0
bclr d0,(a0)
move.w d5,d0
bsr settete ;move heads to 1st track
sf ctrl ;clear end signal
next: movem.l d0-d1/a0/a3,-(a7) ;check if there is a conflict
move.l buffer,d0 ;between the DMA buffer and
move.l d0,d1 ;the actual sector accessed
add.l #$1a00*2,d1
lea.l 11*512(a4),a3
cmp.l d0,a3
ble.b .okbuf
cmp.l d1,a4
bge.b .okbuf
bsr rest_buffer
move.l #$60000,d1
cmp.l #$40000,d0
beq.b .go40
move.l #$40000,d1
.go40 move.l d1,a0
bsr save_buffer
.okbuf movem.l (a7)+,d0-d1/a0/a3
tst.b writes
beq.b ok_read
tst.w startsec ;if write then 1st sector
bne.b fin ;must be a multiple of 11
cmp.w #11,sectpos ;write at least 11 sectors
blt.b fin
bsr sauve
bra.b ok_sauve
ok_read: bsr charge
tst.w drive_err
bne.b fin
ok_sauve: tst.b ctrl ;end of access ?
bne.b fin
tst.b break
bne.b fin
; btst #5,$bfe001 ;removed due to AT 1200 bug !
; beq.b .okspeed
; move.w #NODISK_ERR,drive_err
; bra.b fin
.okspeed movem.l d0/a1,-(a7)
lea.l track,a1
move.w drive,d0
move.w -3*2(a1,d0.w*2),d0 ;get previous track pos
addq.w #1,d0 ;step to next track or side
bsr settete
movem.l (a7)+,d0/a1
bra.w next
fin: bsr timer2
bsr rest_buffer
move.w drive,d0
bset d0,(a0) ;deselect drive
bsr timer1
move.w #$7fff,$9e(a6)
move.w OldAdk,$9e(a6)
tst.w drive_err
movem.l (a7)+,d0-a6
rts
*******************************
motor_on: movem.l d0/a0,-(a7)
lea.l $bfd100,a0
move.w drive,d0
or.b #$80,(a0)
bset d0,(a0)
bsr timer1
and.b #$7f,(a0)
bsr timer1
bclr d0,(a0)
bsr timer1
btst d0,mot_on
bne.b .already_on
move.b #0,$bfe801
.motor_wait cmp.b #30,$bfe801 ;wait > 500 ms
bls.b .motor_wait
bset d0,mot_on
.already_on movem.l (a7)+,d0/a0
rts
;Old code removed due to AT 1200 bug !
;motor_wait: cmp.b #80,$bfe801
; bhi.b .no_mot_on
; btst #5,$bfe001
; bne.b motor_wait
;.out movem.l (a7)+,d0/a0
; rts
;.no_mot_on move.w #NODISK_ERR,drive_err
; bra.b .out
*******************************
motor_off: bsr.w rest_head
movem.l d0/a0,-(a7)
lea.l $bfd100,a0
move.w drive,d0
bset d0,(a0)
bsr timer1
or.b #$80,(a0)
bsr timer1
bclr d0,(a0)
bsr timer1
bset d0,(a0)
bsr timer1
bclr d0,mot_on
movem.l (a7)+,d0/a0
rts
*******************************
;>0.6 ms
timer1 movem.l d0-d1/a6,-(a7)
lea.l $dff000,a6
moveq #10-1,d0
.loop move.b $6(a6),d1
.w1 cmp.b $6(a6),d1
beq.b .w1
dbf d0,.loop
movem.l (a7)+,d0-d1/a6
rts
;>3 ms
timer2 movem.l d0-d1/a6,-(a7)
lea.l $dff000,a6
moveq #50-1,d0
.loop move.b $6(a6),d1
.w1 cmp.b $6(a6),d1
beq.b .w1
dbf d0,.loop
movem.l (a7)+,d0-d1/a6
rts
;>18 ms
timer3 movem.l d0-d1/a6,-(a7)
lea.l $dff000,a6
move.w #284-1,d0
.loop move.b $6(a6),d1
.w1 cmp.b $6(a6),d1
beq.b .w1
dbf d0,.loop
movem.l (a7)+,d0-d1/a6
rts
*******************************
step_head: bclr #0,(a0)
bsr timer1
bset #0,(a0)
bsr timer2
rts
*******************************
;-------------- check which drive is present ----
test_drive movem.l d0-d3/a0-a2,-(a7)
lea.l $bfd100,a0
lea.l $bfe001,a1
move.b #$ff,(a0)
lea.l drive_present,a2
st (a2)+ ;DF0: always present
moveq #4,d0 ;drive1 SEL
moveq #3-1,d3 ;3 drives to test
.next_drive and.b #$7f,(a0)
bsr timer1
bclr d0,(a0) ;switch drive ON
bsr timer1
bset d0,(a0)
bsr timer1
or.b #$80,(a0)
bclr d0,(a0) ;switch drive OFF
bsr timer1
moveq #0,d1 ;d1=drive ID
moveq #32-1,d2
.loop add.l d1,d1
btst #5,(a1) ;one bit of ID in RDY
beq.b .zero
addq.l #1,d1 ;read drive ID
.zero bset d0,(a0) ;pulse SEL
bsr timer1
bclr d0,(a0)
bsr timer1
dbf d2,.loop
bset d0,(a0) ;deselect drive
bsr timer1
tst.l d1
seq (a2)+
addq.w #1,d0 ;next drive
dbf d3,.next_drive
movem.l (a7)+,d0-d3/a0-a2
rts
******************************
;-------------- init head pos -------------------
inittete: movem.l d0/a0-a1,-(a7)
lea.l $bfd100,a0
move.w drive,d0
btst d0,init ;test if the selected drive was inited
bne.b .no_init
bclr d0,(a0)
lea.l old_head,a1
clr.w -3*2(a1,d0.w*2) ;save old position of head here
bset #1,(a0)
bsr timer1
.cont00 btst #4,$bfe001
beq.b .track00
bsr.w step_head
addq.w #2,-3*2(a1,d0.w*2)
bra.b .cont00
.track00 lea.l track,a1
clr.w -3*2(a1,d0.w*2) ;current head pos = 0
bset d0,init
bset d0,(a0)
.no_init movem.l (a7)+,d0/a0-a1
rts
rest_head movem.l d0-d1/a1,-(a7)
move.w drive,d0
btst d0,init
beq.b .no_rest
lea.l $bfd100,a0
bclr d0,(a0)
bsr timer1
bclr d0,init
lea.l old_head,a1
move.w -3*2(a1,d0.w*2),d0
bsr timer1
bsr settete
move.w drive,d0
lea.l track,a1
move.w #-1,-3*2(a1,d0.w*2)
bset d0,(a0)
.no_rest movem.l (a7)+,d0-d1/a1
rts
*******************************
;d0=track to reach (0-159)
settete: movem.l d0-d4,-(a7)
sf d4
bsr timer1
move.l a1,-(a7)
lea.l track,a1
move.w drive,d1
move.w -3*2(a1,d1.w*2),d1 ;get old pos of heads
move.l (a7)+,a1
move.w d0,d3 ;new pos
asr.w #1,d0
asr.w #1,d1
cmp.w d0,d1
blt.b moinstete
bset #1,(a0) ;set dir
sub.w d0,d1
move.w d1,d0
moveq #-2,d2
bra.b go_dbf
moinstete: bclr #1,(a0) ;set dir
sub.w d1,d0
moveq #2,d2
bra.b go_dbf
loop_set: bsr.w step_head
st d4
go_dbf: dbf d0,loop_set
move.l a1,-(a7)
move.w drive,d0
lea.l track,a1
move.w d3,-3*2(a1,d0.w*2) ;set new pos of heads
move.l (a7)+,a1
and.w #1,d3
bne.b impair
bset #2,(a0)
bra.b pair
impair: bclr #2,(a0)
pair: bsr timer2
tst.b d4
beq.b .nomove
bsr timer3
.nomove
movem.l (a7)+,d0-d4
rts
***************************************
charge: movem.l d0/d7/a3,-(a7)
moveq #5-1,d7
.loop move.w #$4000,$24(a6)
bsr timer1
move.l buffer,a3
move.l a3,$20(a6)
move.w #$9a00,d0 ;len=$1a00*2=$3400
move.w #2,$9c(a6)
move.w d0,$24(a6)
move.w d0,$24(a6)
move.b #0,$bfe801
.waitdmad cmp.b #100,$bfe801 ;wait no more than 2s
bhi.b .error
move.w $1e(a6),d0
and.w #2,d0
beq.b .waitdmad
move.w #$4000,$24(a6)
bsr.b dmfm
beq.b .out
dbf d7,.loop ;retry
.error move.w #TRACKCORRUPT_ERR,drive_err ;track corrupted
.out movem.l (a7)+,d0/d7/a3
rts
***************************************
dmfm: movem.l d0-d7/a0-a2,-(a7)
move.l #$55555555,d7
move.l a4,a0 ;save old status
move.w sectpos,oldsectpos
move.w startsec,oldstartsec
moveq #11-1,d4
moveq #0,d3
move.l a3,a1
lea.l $1a00*2(a1),a1
nextsector: move.l a3,a2
seek: cmp.l a1,a2
bge.w mfm_error
cmp.w #$4489,(a2)+
bne.b seek
cmp.w #$4489,(a2)
beq.b seek
move.b 2(a2),D0
move.b 6(a2),D1
and.b d7,d0
and.b d7,d1
add.b d0,d0
or.b d1,d0
cmp.b d0,d3
beq.b oksec
lea.l $43e(a2),a2
bra.b seek
oksec: addq.l #1,d3
lea.l $0028(a2),a2
move.l (a2)+,d0
move.l (a2)+,d1
and.l d7,d0
and.l d7,d1
add.l d0,d0
or.l d1,d0
move.l d0,d6
move.l a2,-(a7)
lea.l -$30(a2),a2
moveq #0,d0
moveq #$0a-1,d5
.nextcheck: move.l (a2)+,d1
eor.l d1,d0
dbf d5,.nextcheck
move.l (a7)+,a2
and.l d7,d0
cmp.l d6,d0 ;test header checksum
bne.w mfm_error
move.l (a2)+,d0
move.l (a2)+,d1
and.l d7,d0
and.l d7,d1
add.l d0,d0
or.l d1,d0
move.l d0,d6
move.l a2,-(a7)
moveq #0,d0
move.w #$100/4-1,d5
.nextcheck2: move.l (a2)+,d1
eor.l d1,d0
move.l (a2)+,d1
eor.l d1,d0
move.l (a2)+,d1
eor.l d1,d0
move.l (a2)+,d1
eor.l d1,d0
dbf d5,.nextcheck2
move.l (a7)+,a2
and.l d7,d0
cmp.l d6,d0 ;test data checksum
bne.b mfm_error
tst.w sectpos ;all sectors loaded ?
beq.b pasokload
tst.w startsec;have we reached the 1st sector to load ?
beq.b okloadsec
subq.w #1,startsec
bra.b pasokload
okloadsec: moveq #$80-1,d5
decodemfm: move.l $200(a2),d1
move.l (a2)+,d0
and.l d7,d0
and.l d7,d1
add.l d0,d0
or.l d1,d0
move.l d0,(a4)+
dbf d5,decodemfm
subq.w #1,sectpos ;nb sectors to load --
bne.b pasokload
st ctrl ;set end signal
bra.b reload
pasokload: dbf d4,nextsector
reload: movem.l (a7)+,d0-d7/a0-a2
moveq #0,d0 ;ok
rts
mfm_error: move.w oldsectpos,sectpos ;restore status
move.w oldstartsec,startsec
move.l a0,a4
movem.l (a7)+,d0-d7/a0-a2
moveq #-1,d0 ;an error occured
rts
***************************************************
sauve: bsr.b code_mfm
move.w #$4000,$24(a6)
bsr timer2
move.l buffer,a3
move.l a3,$20(a6)
move.w #$c000+$220*11+$2a0,d0
move.w #2,$9c(a6)
move.w d0,$24(a6)
move.w d0,$24(a6)
waitdmad2: move.w $1e(a6),d0
and.w #2,d0
beq.b waitdmad2
move.w #$4000,$24(a6)
bsr timer2
rts
***********************************
;Code track
;-> a4=data to be coded
code_mfm: movem.l a0-a3/d0-d7,-(a7)
lea.l track,a3
move.w drive,d0
move.w -3*2(a3,d0.w*2),d0 ;get track no
move.l buffer,a3
move.l #$55555555,d5
move.l d5,d6
add.l d6,d6 ;d6=$aaaaaaaa
tst.b format
beq.b .noformat
tst.b first_sauve
bne.b .fast
.noformat move.w #$1a00*2/16-1,d1
.filla move.l d6,(a3)+
move.l d6,(a3)+
move.l d6,(a3)+
move.l d6,(a3)+
dbf d1,.filla
.fast move.l buffer,a3
lea.l $1a00*2-$440*11-$20(a3),a3
bsr.b do_track
st first_sauve
movem.l (a7)+,a0-a3/d0-d7
rts
*******************************
;-> a3=ptr on dest track
;-> a4=ptr on data to write
;-> d0=no of track
do_track: move.b d0,header+1
move.w #$000b,header+2
moveq #11-1,d4
next_sec: bsr.b code_sector
lea.l $220*2(a3),a3 ;go next sector
add.w #$00ff,header+2 ;inc actual sec, dec sec left
subq.w #1,sectpos
dbf d4,next_sec
tst.w sectpos
bne.b .noend
st ctrl ;set end signal
.noend rts
*******************************
code_sector move.l a3,a0
addq.l #4,a0
move.l #$44894489,(a0)+ ;sync
move.l header,d0
bsr.w code
lea.l 8(a3),a0
moveq #10,d1
bsr.w chk_sum
bsr.b code
tst.b format
beq.b .no_format
move.l track_buffer,a4
tst.b first_sauve
bne.b .out
moveq #0,d0
move.w #512/16-1,d7
.clear move.l d0,(a4)+
move.l d0,(a4)+
move.l d0,(a4)+
move.l d0,(a4)+
dbf d7,.clear
move.l track_buffer,a4
move.l #$444f5301,(a4) ;'DOS',1 = FFS
.no_format
addq.l #8,a0
moveq #$80-1,d7
.code_sec: move.l (a4)+,d0
move.l d0,d3
lsr.l #1,d0
bsr.w coder2
lea.l $200-4(a0),a0
move.l d3,d0
bsr.w coder2
lea.l -$200(a0),a0
dbf d7,.code_sec
lea.l $40(a3),a0
move.w #$100,d1
bsr.w chk_sum2
lea.l $38(a3),a0
bsr.b code
.out rts
*******************************
; a0 = address du buffer code
; d0 = long word to code
code: movem.l d2/d3,-(a7)
move.l d0,d3
lsr.l #1,d0
bsr.b coder
move.l d3,d0
bsr.b coder2
movem.l (a7)+,d2/d3
rts
*******************************
coder: and.l d5,d0
move.l d0,d2
eor.l d5,d2
move.l d2,d1
add.l d2,d2
lsr.l #1,d1
bset #31,d1
and.l d2,d1
or.l d1,d0
btst #0,-1(a0)
beq.b pas_bit
bclr #31,d0
pas_bit: move.l d0,(a0)+
rts
*******************************
chk_sum: move.l d2,-(a7)
subq.w #1,d1
moveq #0,d0
l_chks: move.l (a0)+,d2
eor.l d2,d0
dbf d1,l_chks
and.l d5,d0
move.l (a7)+,d2
rts
chk_sum2: move.l d2,-(a7)
subq.w #1,d1
moveq #0,d0
l_chks2: move.l (a0)+,d2
eor.l d2,d0
dbf d1,l_chks2
move.l (a7)+,d2
and.l d5,d0
rts
*******************************
coder2: and.l d5,d0
move.l d0,d2
eor.l d5,d2
move.l d2,d1
add.l d2,d2
lsr.l #1,d1
bset #31,d1
and.l d2,d1
or.l d1,d0
btst #0,-1(a0)
beq.b pas_bitx
bclr #31,d0
pas_bitx: move.l d0,(a0)+
move.b (a0),d1
btst #0,d0
bne.b bit0
btst #6,d1
bne.b bit6
bset #7,d1
bra.b go7
bit0: bclr #7,d1
go7: move.b d1,(a0)
bit6: rts
**************************************************************************
**************************************************************************
;----------------------------------------------------------
NODISK_ERR equ 1
TRACKCORRUPT_ERR equ 2
BADCHECKSUM_ERR equ 3
NOTDOS_ERR equ 4
WRITEPROTECT_ERR equ 5
CREATEFILE_ERR equ 6
FILENOTFOUND_ERR equ 7
DISKFULL_ERR equ 8
FILEEXIST_ERR equ 9
DEVICENOTFOUND_ERR equ 10
ILLEGALPATH_ERR equ 11
NOFFS_ERR equ 12
IDE_ERR equ 13
NOTEMPTY_ERR equ 14
STRUCTURE partition,0
ULONG part_next ;ptr on next partition
ULONG part_first ;first sector of this partition
ULONG part_nbsec ;nb sectors in this partition
ULONG part_device ;ptr on device
UWORD part_unit ;unit number
ULONG part_filesystem ;filesystem ID (DOS\0,....) 0=nodisk
STRUCT part_name,32 ;partition_name (BCPL) (upper case)
STRUCT part_name2,32 ;partition_name (BCPL) (original case)
LABEL part_SIZEOF
STRUCTURE file_handle,0
ULONG file_part ;ptr on partition
ULONG file_parent ;parent
ULONG file_header
ULONG file_extension
ULONG file_extpos
ULONG file_size
ULONG file_seek
STRUCT file_name,32 ;1st byte=len of name (max 30) (BCPL)
UBYTE file_written
UBYTE file_dir ;0=it is a file, -1 it is a dir
;(used by ExNext only)
LABEL file_SIZEOF
;-------------- device is accesed by open,read,write,close,seek... cmd ------
READ_CMD equ 0
WRITE_CMD equ 4
UPDATE_CMD equ 8
MOTOFF_CMD equ 12
CHANGE_CMD equ 16
READM_CMD equ 20
WRITEM_CMD equ 24
OPT_OFF
floppy_device bra.w floppy_read
bra.w floppy_write
bra.w floppy_update
bra.w floppy_motoff
bra.w floppy_change
bra.w floppy_readm
bra.w floppy_writem
OPT_ON
;-> a3=ptr on part
;-> d0=no of first block to read
;-> d1=nb of block to read
;-> on stack=ptr on blocks
floppy_readm movem.l d0-d1/a0/a4,-(a7)
lea.l 4+4*4(a7,d1.w*4),a4
bra.b .godbf
.loop move.l -(a4),a0
bsr floppy_read
addq.l #1,d0
.godbf dbf d1,.loop
movem.l (a7)+,d0-d1/a0/a4
move.l (a7),(a7,d1.w*4)
lea.l (a7,d1.w*4),a7
rts
;-> a3=ptr on part
;-> d0=no of first block to write
;-> d1=nb of block to write
;-> on stack=ptr on blocks
floppy_writem movem.l d0-d1/a0/a4,-(a7)
lea.l 4+4*4(a7,d1.w*4),a4
bra.b .godbf
.loop move.l -(a4),a0
bsr floppy_write
addq.l #1,d0
.godbf dbf d1,.loop
movem.l (a7)+,d0-d1/a0/a4
move.l (a7),(a7,d1.w*4)
lea.l (a7,d1.w*4),a7
rts
;-> a3=ptr on part
;-> d0=no of block to read
;-> a0=buffer ptr
floppy_read move.l d0,-(a7)
add.l part_first(a3),d0
cmp.w #0,part_unit(a3) ;DF0 ?
bne.b .no0
cmp.w #3,drive
beq.b .read
bsr write_flush
move.w #3,drive
move.l d0,-(a7)
moveq #1,d0 ;force floppy change
bsr floppy_change
move.l (a7)+,d0
bra.b .read
.no0 cmp.w #1,part_unit(a3) ;DF1 ?
bne.b .no1
cmp.w #4,drive
beq.b .read
bsr write_flush
move.w #4,drive
move.l d0,-(a7)
moveq #1,d0 ;force floppy change
bsr floppy_change
move.l (a7)+,d0
bra.b .read
.no1 bra.b .err
.read bsr read_fsector
.err move.l (a7)+,d0
rts
;-> a3=ptr on part
;-> d0=no of block to write
;-> a0=buffer ptr
floppy_write move.l d0,-(a7)
bsr signal_write
add.l part_first(a3),d0
cmp.w #0,part_unit(a3) ;DF0 ?
bne.b .no0
cmp.w #3,drive
beq.b .write
bsr write_flush
move.w #3,drive
move.l d0,-(a7)
moveq #1,d0 ;force floppy change
bsr floppy_change
move.l (a7)+,d0
bra.b .write
.no0 cmp.w #1,part_unit(a3) ;DF1 ?
bne.b .no1
cmp.w #4,drive
beq.b .write
bsr write_flush
move.w #4,drive
move.l d0,-(a7)
moveq #1,d0 ;force floppy change
bsr floppy_change
move.l (a7)+,d0
bra.b .write
.no1 bra.b .err
.write bsr write_fsector
.err move.l (a7)+,d0
rts
;-> a3=ptr on part
floppy_update bsr write_flush
rts
;-> a3=ptr on part
floppy_motoff cmp.w #0,part_unit(a3) ;DF0 ?
bne.b .no0
cmp.w #3,drive
beq.b .motoff
bsr write_flush
move.w #3,drive
move.l d0,-(a7)
moveq #1,d0 ;force floppy change
bsr floppy_change
move.l (a7)+,d0
bra.b .motoff
.no0 cmp.w #1,part_unit(a3) ;DF1 ?
bne.b .no1
cmp.w #4,drive
beq.b .motoff
bsr write_flush
move.w #4,drive
move.l d0,-(a7)
moveq #1,d0 ;force floppy change
bsr floppy_change
move.l (a7)+,d0
bra.b .motoff
.no1 bra.b .err
.motoff bsr motor_off
.err rts
;-> a3=ptr on part
;-> d0=cmd 0=test if changed 1=force change
;<- d0 0=nochange -1=nodisk 1=newdisk
floppy_change movem.l a0,-(a7)
tst.l d0
bne.w .force
cmp.w #0,part_unit(a3) ;DF0 ?
bne.b .no0
cmp.w #3,drive
beq.w .gochg
bsr write_flush
move.w #3,drive
movem.l d0/a0,-(a7)
lea.l track_sector,a0
moveq #-1,d0
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.w d0,track_buffer_no
movem.l (a7)+,d0/a0
bra.b .gochg
.no0 cmp.w #1,part_unit(a3) ;DF1 ?
bne.b .no1
cmp.w #4,drive
beq.b .gochg
bsr write_flush
move.w #4,drive
movem.l d0/a0,-(a7)
lea.l track_sector,a0
moveq #-1,d0
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.w d0,track_buffer_no
movem.l (a7)+,d0/a0
bra.b .gochg
.no1 bra.w .err
.force lea.l track_sector,a0
moveq #-1,d0
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.w d0,track_buffer_no
moveq #1,d0 ;new disk
bra.b .out
.gochg lea.l $bfd100,a0
move.w drive,d0
bclr d0,(a0) ;select drive
bclr #1,(a0) ;step dir -> 80
bsr timer1
btst #2,$bfe001 ;/CHNG ?
bne.b .nochg
bsr step_head
bset #1,(a0) ;step dir -> 00
bsr timer1
bsr step_head
bsr timer1
btst #2,$bfe001
bne.b .newdisk
bset d0,(a0) ;deselect drive
move.w #NODISK_ERR,drive_err
moveq #-1,d0 ;no disk
bra.b .out
.newdisk bset d0,(a0) ;deselect drive
lea.l track_sector,a0
moveq #-1,d0
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.w d0,track_buffer_no
moveq #1,d0 ;new disk
bra.b .out
.nochg bset d0,(a0) ;deselect drive
moveq #0,d0 ;no change
bra.b .out
.err moveq #1,d0
.out movem.l (a7)+,a0
rts
OPT_OFF
ide_device bra.w ide_read
bra.w ide_write
bra.w ide_update
bra.w ide_motoff
bra.w ide_change
bra.w ide_readm
bra.w ide_writem
OPT_ON
;-> a3=ptr on part
;-> d0=no of first block to read
;-> d1=nb of block to read
;-> on stack=ptr on blocks
ide_readm movem.l d0-d1/a0/a4,-(a7)
lea.l 4+4*4(a7,d1.w*4),a4
bra.b .godbf
.loop move.l -(a4),a0
bsr ide_read
addq.l #1,d0
.godbf dbf d1,.loop
movem.l (a7)+,d0-d1/a0/a4
move.l (a7),(a7,d1.w*4)
lea.l (a7,d1.w*4),a7
rts
;-> a3=ptr on part
;-> d0=no of first block to write
;-> d1=nb of block to write
;-> on stack=ptr on blocks
ide_writem movem.l d0-d2/a0,-(a7)
bsr signal_write
add.l part_first(a3),d0
lea.l 4+4*4(a7,d1.w*4),a0
move.w d1,d2
move.w part_unit(a3),d1
bsr WriteM_Block
tst.l d0
beq.b .noerr
.err move.w #IDE_ERR,drive_err
.noerr
movem.l (a7)+,d0-d2/a0
move.l (a7),(a7,d1.w*4)
lea.l (a7,d1.w*4),a7
rts
;-> a3 = part
signal_write movem.l d2/a0/a3,-(a7)
lea.l changed_disk,a0
moveq #16-1,d2
.seek cmp.l (a0)+,a3
beq.b .found
dbf d2,.seek
lea.l changed_disk,a0
.seek2 tst.l (a0)+
bne.b .seek2
move.l a3,-4(a0)
.found movem.l (a7)+,d2/a0/a3
rts
;-> d0=block no
;-> a0=address
;-> a3=part
ide_read movem.l d0-d1,-(a7)
cmp.l part_nbsec(a3),d0
bge.b .err
add.l part_first(a3),d0
move.w part_unit(a3),d1
bsr Read_Block
tst.l d0
beq.b .noerr
.err move.w #IDE_ERR,drive_err
.noerr movem.l (a7)+,d0-d1
rts
;-> d0=block no
;-> a0=address
;-> a3=part
ide_write movem.l d0-d1,-(a7)
bsr signal_write
cmp.l part_nbsec(a3),d0
bge.b .err
add.l part_first(a3),d0
move.w part_unit(a3),d1
bsr Write_Block
tst.l d0
beq.b .noerr
.err move.w #IDE_ERR,drive_err
.noerr movem.l (a7)+,d0-d1
rts
ide_update rts
ide_motoff rts
ide_change moveq #0,d0 ;no change
rts
;-------------- find the partitions on the HardDisks ------
find_part movem.l d0-a4,-(a7)
lea.l floppy0,a1
.seekend move.l (a1),d1
beq.b .endoflist
move.l d1,a1
bra.b .seekend
.endoflist lea.l secbuf,a0
moveq #0,d1
bsr Read_ID
tst.l d0
bne.b .nodrive0
bsr .search_part
.nodrive0
tst.b config_elsat
bne.b .nodrive1
lea.l secbuf,a0
moveq #1,d1
bsr Read_ID
tst.l d0
bne.b .nodrive1
bsr .search_part
.nodrive1
lea.l secbuf,a0
moveq #0,d1
moveq #0,d0
tst.w IDE_info0
beq.b .no0
bsr Read_Block
.no0
movem.l (a7)+,d0-a4
rts
;-------------- search partitions in rigid disk blocks ----
;-> d1=drive no (unit)
;-> a1=last partition
.search_part
moveq #0,d6
.seek lea.l secbuf,a0
move.l d6,d0
bsr Read_Block ;read first RDSK
cmp.l #"RDSK",(a0)
beq.b .okrdsk
addq.l #1,d6
cmp.l #RDB_LOCATION_LIMIT,d6
beq.w .error
bra.b .seek
.okrdsk move.l rdb_Sectors(a0),d6
move.l rdb_Heads(a0),d0
mulu d0,d6 ;d6=nbsectors/cyl
move.l rdb_PartitionList(a0),d0
beq.w .error
.read_next moveq #-1,d2
cmp.l d2,d0 ;end of list ?
beq.w .error
bsr Read_Block ;read PART
cmp.l #"PART",(a0)
bne.w .error
move.l 192(a0),d0
lsr.l #8,d0
cmp.l #"DOS",d0 ;Amiga DOS filesystem ?
bne.w .next
lea.l part_SIZEOF(a1),a2
cmp.l #harddisk_end,a2 ;max nb of part reached ?
bge.w .error
move.l a2,part_next(a1)
move.l a2,a1
clr.l part_next(a1)
lea.l pb_DriveName(a0),a2
lea.l part_name(a1),a3
lea.l part_name2(a1),a4
clr.l (a3) ;clear DF1: name if needed
moveq #0,d2
move.b (a2)+,d2
move.b d2,(a3)+ ;copy name length
move.b d2,(a4)+
bra.b .godbf2
.copyn move.b (a2)+,d0
move.b d0,(a4)+
bsr upper_case
move.b d0,(a3)+ ;copy Partition name
.godbf2 dbf d2,.copyn
move.l $a4(a0),d0 ;First cylinder
mulu d6,d0 ;d0=first sector
move.l d0,part_first(a1)
move.l $a8(a0),d2 ;last cylinder
addq.w #1,d2
mulu d6,d2 ;last sector+1
sub.l d0,d2
move.l d2,part_nbsec(a1)
move.w d1,part_unit(a1)
move.l #ide_device,part_device(a1)
lea.l extension,a0
bsr Read_Block ;Read first sector
move.l (a0),part_filesystem(a1)
lea.l secbuf,a0
.next move.l pb_Next(a0),d0
bne.w .read_next
.error rts
;----------------------------------------------------------
ide_base dc.l 0 ;$da2000 / $dd2020 / $EB8000 (A1200,A4000,CD32elsat)
ide_irq dc.l 0 ;$da9000 / $dd3020 / $0
ide_data dc.w 0
ide_error dc.w 0
ide_feature dc.w 0
ide_secnt dc.w 0
ide_secnb dc.w 0
ide_cyllo dc.w 0
ide_cylhi dc.w 0
ide_dhead dc.w 0
ide_status dc.w 0
ide_command dc.w 0
ide_altstat dc.w 0
;$da8000+$1000 interrupt register
;-> a0=ID_Buffer
;-> d1=drive no (0/1)
;<- d0=error 0=ok -1=an error occured (No Drive)
Read_ID movem.l d1-d2/a0-a1/a3,-(a7)
lea.l IDE_info0,a1
tst.w d1
beq.b .okdrive0
lea.l IDE_info1,a1
.okdrive0
move.l ide_base(pc),a3
move.b #0,$bfe801
.wait cmp.b #80,$bfe801
bhi.w .error
move.w ide_status,d0
tst.b (a3,d0.w)
bmi.b .wait ;BUSY ?
lsl.b #4,d1
and.b #$10,d1 ;Drive bit
or.b #$a0,d1
move.w ide_dhead,d0
move.b d1,(a3,d0.w)
move.w ide_command,d0
move.b #$EC,(a3,d0.w) ;Identify Drive cmd
bsr wait_irq2
bne.b .error
move.w ide_status,d0
move.b (a3,d0.w),d0
btst #0,d0
bne.b .error
movem.l a0/a1,-(a7)
move.w ide_data,d0
lea.l (a3,d0.w),a1
move.w #512/2-1,d0
.copy move.w (a1),d1
ror.w #8,d1 ;LittleEndian to BigEndian
move.w d1,(a0)+
dbf d0,.copy
movem.l (a7)+,a0/a1
move.w 1*2(a0),II_NbCyl(a1)
move.w 3*2(a0),II_NbHeads(a1)
move.w 6*2(a0),II_NbSecTrack(a1)
moveq #0,d1
move.w 59*2(a0),d0
btst #8,d0 ;setting valid ?
beq.b .nomult
move.b d0,d1
.nomult move.w d1,II_MultSize(a1)
move.w ide_status,d0
move.b (a3,d0.w),d0
btst #0,d0
bne.b .error
moveq #0,d0
bra.b .out
.error moveq #-1,d0
.out movem.l (a7)+,d1-d2/a0-a1/a3
rts
;-> a3=ide_base
wait_irq movem.l d0/a0,-(a7)
move.w #8,$dff09a ;disable CIA IRQ
tst.l ide_irq
bne.b .nocd32
move.w ide_altstat,d0
.busy tst.b (a3,d0.w)
bmi.b .busy
move.w ide_status,d0
move.b (a3,d0.w),d0 ;ack int
bra.b .ok
.nocd32 tst.b IDE_IRQ ;already got IRQ ?
bne.b .ok
.noirq move.l ide_irq(pc),a0
move.b (a0),d0
bpl.b .noirq
tst.b config_A1200
bne.b .go1200
move.w ide_status,d0
move.b (a3,d0.w),d0
bra.b .ok
.go1200 move.w SR,-(a7)
move.w #$2700,sr
move.w ide_status,d0
move.b (a3,d0.w),d0
move.b (a0),d0
andi.b #3,d0
or.b #$7c,d0
move.b d0,(a0)
move.w (a7)+,SR
.ok sf IDE_IRQ
move.w #$8008,$dff09a ;enable CIA IRQ
movem.l (a7)+,d0/a0
rts
;same as wait_irq but doesn't wait more than 80 ticks
;-> a3=ide_base
;<- Z flag RESULT unset=ERROR set=OK
wait_irq2 movem.l d0/a0,-(a7)
move.w #8,$dff09a ;disable CIA IRQ
tst.l ide_irq
bne.b .nocd32
move.b #0,$bfe801
.loop cmp.b #80,$bfe801
bhi.w .err
move.w ide_altstat,d0
move.b (a3,d0.w),d0
bpl.b .ok2
bra.b .loop
.ok2 move.w ide_status,d0
move.b (a3,d0.w),d0 ;ack int
btst #0,d0
bne.w .err
jmp .ok
.nocd32 tst.b IDE_IRQ ;already got IRQ ?
bne.b .ok
move.b #0,$bfe801
.noirq cmp.b #80,$bfe801
bhi.b .err
move.l ide_irq(pc),a0
move.b (a0),d0
bpl.b .noirq
tst.b config_A1200
bne.b .go1200
move.w ide_status,d0
move.b (a3,d0.w),d0
bra.b .ok
.go1200 move.w SR,-(a7)
move.w #$2700,sr
move.w ide_status,d0
move.b (a3,d0.w),d0
move.b (a0),d0
andi.b #3,d0
or.b #$7c,d0
move.b d0,(a0)
move.w (a7)+,SR
.ok sf IDE_IRQ
move.w #$8008,$dff09a ;enable CIA IRQ
moveq #0,d0
movem.l (a7)+,d0/a0
rts
.err move.w #$8008,$dff09a ;enable CIA IRQ
moveq #-1,d0
movem.l (a7)+,d0/a0
rts
;-> d0=block no
;-> d1=drive no (0/1)
;-> a0=dest address
Read_Block movem.l d1-d2/a0-a1/a3,-(a7)
lea.l IDE_info0,a1
tst.w d1
beq.b .okdrive0
lea.l IDE_info1,a1
.okdrive0
tst.w (a1) ;drive exists ?
beq.w .error
move.l ide_base(pc),a3
.wait move.w ide_status,d2
tst.b (a3,d2.w)
bmi.b .wait ;BUSY ?
lsl.b #4,d1
and.b #$10,d1 ;Drive bit
or.b #$a0,d1
move.w II_NbHeads(a1),d2 ;nb_heads
mulu II_NbSecTrack(a1),d2 ;*nb_sectrack d2=nb sec/cyl
tst.w d2
beq.w .error
divu d2,d0 ;d0=cyl no.
cmp.w II_NbCyl(a1),d0 ;nb_cyl
bge.w .error
move.w ide_cyllo,d2
move.b d0,(a3,d2.w)
lsr.w #8,d0
move.w ide_cylhi,d2
move.b d0,(a3,d2.w)
clr.w d0
swap d0
divu II_NbSecTrack(a1),d0 ;/nb_sectrack d0=no of head
and.w #%1111,d0
or.b d0,d1
swap d0
cmp.w II_NbSecTrack(a1),d0 ;nb_sectrack
bge.w .error
addq.b #1,d0
move.w ide_secnb,d2
move.b d0,(a3,d2.w) ;start sector
move.w ide_dhead,d2
move.b d1,(a3,d2.w)
move.w ide_secnt,d2
move.b #1,(a3,d2.w) ;read 1 sector
move.w ide_command,d2
move.b #$20,(a3,d2.w) ;Read Drive cmd
bsr wait_irq
move.w ide_status,d0
move.b (a3,d0.w),d0
btst #0,d0
bne.b .error
move.w ide_data,d0
lea.l (a3,d0.w),a1
move.w #512/32-1,d0
.read move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
move.w (a1),(a0)+
dbf d0,.read
move.w ide_status,d0
move.b (a3,d0.w),d0
btst #0,d0
bne.b .error
moveq #0,d0
bra.b .out
.error moveq #-1,d0
.out movem.l (a7)+,d1-d2/a0-a1/a3
rts
;-> d0=block no
;-> d1=drive no (0/1)
;-> a0=source address
Write_Block movem.l d1-d2/a0-a1/a3,-(a7)
lea.l IDE_info0,a1
tst.w d1
beq.b .okdrive0
lea.l IDE_info1,a1
.okdrive0
tst.w (a1) ;drive exists ?
beq.w .error
move.l ide_base(pc),a3
.wait move.w ide_status,d2
tst.b (a3,d2.w)
bmi.b .wait ;BUSY ?
lsl.b #4,d1
and.b #$10,d1 ;Drive bit
or.b #$a0,d1
move.w II_NbHeads(a1),d2 ;nb_heads
mulu II_NbSecTrack(a1),d2 ;*nb_sectrack d2=nb sec/cyl
divu d2,d0 ;d0=cyl no.
tst.w d2
beq.w .error
cmp.w II_NbCyl(a1),d0 ;nb_cyl
bge.w .error
move.w ide_cyllo,d2
move.b d0,(a3,d2.w)
lsr.w #8,d0
move.w ide_cylhi,d2
move.b d0,(a3,d2.w)
clr.w d0
swap d0
divu II_NbSecTrack(a1),d0 ;/nb_sectrack d0=no of head
and.w #%1111,d0
or.b d0,d1
swap d0
cmp.w II_NbSecTrack(a1),d0 ;nb_sectrack
bge.w .error
addq.b #1,d0
move.w ide_secnb,d2
move.b d0,(a3,d2.w) ;start sector
move.w ide_dhead,d2
move.b d1,(a3,d2.w)
move.w ide_secnt,d2
move.b #1,(a3,d2.w) ;read 1 sector
move.w ide_command,d2
move.b #$30,(a3,d2.w) ;Write Drive cmd
.busy move.w ide_status,d0
move.b (a3,d0.w),d0
bmi.b .busy
btst #0,d0
bne.b .error
btst #3,d0 ;DRQ ?
beq.b .busy
move.w ide_data,d0
lea.l (a3,d0.w),a1
move.w #512/32-1,d0
.write move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
move.w (a0)+,(a1)
dbf d0,.write
bsr wait_irq
.busy2 move.w ide_status,d0
move.b (a3,d0.w),d0
btst #0,d0
bne.b .error
btst #7,d0
bne.b .busy2
moveq #0,d0
bra.b .out
.error moveq #-1,d0
.out movem.l (a7)+,d1-d2/a0-a1/a3
rts
;-> d0=block no
;-> d1=drive no (0/1)
;-> d2=nb ok blocks to write
;-> a0=ptr on top of stack of source address
WriteM_Block movem.l d1-d3/a0-a3,-(a7)
lea.l IDE_info0,a1
tst.w d1
beq.b .okdrive0
lea.l IDE_info1,a1
.okdrive0
tst.w d2
beq.w .error
tst.w (a1) ;drive exists ?
beq.w .error
move.l ide_base(pc),a3
.wait move.w ide_status,d3
tst.b (a3,d3.w)
bmi.b .wait ;BUSY ?
lsl.b #4,d1
and.b #$10,d1 ;Drive bit
or.b #$a0,d1
move.w II_NbHeads(a1),d3 ;nb_heads
mulu II_NbSecTrack(a1),d3 ;*nb_sectrack d3=nb sec/cyl
tst.w d3
beq.w .error
divu d3,d0 ;d0=cyl no.
cmp.w II_NbCyl(a1),d0 ;nb_cyl
bge.w .error
move.w ide_cyllo,d3
move.b d0,(a3,d3.w)
lsr.w #8,d0
move.w ide_cylhi,d3
move.b d0,(a3,d3.w)
clr.w d0
swap d0
divu II_NbSecTrack(a1),d0 ;/nb_sectrack d0=no of head
and.w #%1111,d0
or.b d0,d1
swap d0
cmp.w II_NbSecTrack(a1),d0 ;nb_sectrack
bge.w .error
addq.b #1,d0
move.w ide_secnb,d3
move.b d0,(a3,d3.w) ;start sector
move.w ide_dhead,d3
move.b d1,(a3,d3.w)
move.w ide_secnt,d3
move.b d2,(a3,d3.w) ;write d2 sectors
moveq #$30,d0 ;WriteSector
move.w ide_command,d3
move.b d0,(a3,d3.w) ;Drive cmd
subq.w #1,d2 ;for dbf
.busy move.w ide_status,d0
move.b (a3,d0.w),d0
bmi.b .busy
btst #0,d0
bne.b .error
btst #3,d0 ;DRQ ?
beq.b .busy
move.l -(a0),a2 ;get next block address
move.w ide_data,d0
lea.l (a3,d0.w),a1
move.w #512/32-1,d0
.write move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
move.w (a2)+,(a1)
dbf d0,.write
bsr wait_irq
dbf d2,.busy
.busy2 move.w ide_status,d0
move.b (a3,d0.w),d0
btst #0,d0
bne.b .error
btst #7,d0
bne.b .busy2
moveq #0,d0
bra.b .out
.error moveq #-1,d0
.out movem.l (a7)+,d1-d3/a0-a3
rts
****************************************************************
include src/file.s
include src/fbuffers.s
include src/cmd_p.s
include src/cmd_sp.s
**************************************************************************
;-------------- read the palette from custom registers -------------------
read_palette movem.l d0-d2/a0-a1,-(a7)
tst.b config_AGA
beq.b .noaga
move.w #$0100,$104(a6) ;set read mode
lea.l paletteL,a0
move.w #$200,d0
moveq #8-1,d1
.loop_bank move.w d0,$106(a6)
lea.l $180(a6),a1
moveq #32-1,d2
.color move.w (a1)+,(a0)+ ;copy bank
dbf d2,.color
add.w #$2000,d0
dbf d1,.loop_bank
lea.l paletteH,a0
moveq #0,d0
moveq #8-1,d1
.loop_bank2 move.w d0,$106(a6)
lea.l $180(a6),a1
moveq #32-1,d2
.color2 move.w (a1)+,(a0)+ ;copy bank
dbf d2,.color2
add.w #$2000,d0
dbf d1,.loop_bank2
move.w #0,$104(a6) ;set write mode
.noaga movem.l (a7)+,d0-d2/a0-a1
rts
restore_palette movem.l d0-d2/a0-a1,-(a7)
tst.b config_AGA
beq.b .noaga
lea.l paletteH,a0
moveq #0,d0
moveq #8-1,d1
.loop_bank2 move.w d0,$106(a6)
lea.l $180(a6),a1
moveq #32-1,d2
.color2 move.w (a0)+,(a1)+ ;copy bank
dbf d2,.color2
add.w #$2000,d0
dbf d1,.loop_bank2
lea.l paletteL,a0
move.w #$200,d0
moveq #8-1,d1
.loop_bank move.w d0,$106(a6)
lea.l $180(a6),a1
moveq #32-1,d2
.color move.w (a0)+,(a1)+ ;copy bank
dbf d2,.color
add.w #$2000,d0
dbf d1,.loop_bank
move.w custom+$10c,$10c(a6) ;for palette EOR
move.w #0,$106(a6)
.noaga movem.l (a7)+,d0-d2/a0-a1
rts
**************************************************************************
;-------------- SCAN scan memory for samples -----------------------------
cmd_scan
bra.l end_command
**************************************************************************
*************** MMU routines *********************************************
**************************************************************************
;set a page mode
;-> a0 address
;-> mode 0=normal, 1=write protected, read/write protected
;<- d0 error (0=ok)
mmu_set_page:
cmp.w #4,proc_type
blt.b .err
;-------------- 68040/68060 MMU -----------
nop
.err moveq #-1,d0
rts
**************************************************************************
include src/disassemble.s
include src/assemble.s
;make a copy of registers for disassemble function
init_regBMON lea.l regsBMON,a1
lea.l registres,a0
moveq #16-1,d0
.copy move.l (a0)+,(a1)+
dbf d0,.copy
move.l usp_reg,(a1)+
move.l isp_reg,(a1)+
move.l msp_reg,(a1)+
move.l vbr_reg,(a1)+
move.l cacr_reg,(a1)+
move.l caar_reg,(a1)+
move.l pc_reg,(a1)+
moveq #0,d0
move.w sr_reg,d0
move.l d0,(a1)+
rts
************************************************************
include src/keymaps.s
;----------------------------------------------------------------------------
ascII dc.b "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
dc.b "0123456789+",'"'
dc.b "*ç%&/()=?'!$#-,;:[]<>@.éàèöäü",$5c,"|§°_¹²{} "
end_ascII
;--- special ascII -------
; '¹' = continous line
; '²' = small dot
;----------------------------------------------------------------------------
ascIIx dcb.b $20,"²"
dc.b ' !"£$%&',"'()*+,-./0123456789:;<=>?@"
dc.b "ABCDEFGHIJKLMNOPQRSTUVWXYZ[",$5c,"]^_²"
dc.b "abcdefghijklmnopqrstuvwxyz"
dc.b "{|}²çüé²äà²ç²²è"
dcb.b 256,"²"
even
hex_list dc.b "0123456789ABCDEF"
cnop 0,4
ascII_conv dcb.b 256,0
file_len_txt dc.b "File length=$",0
BP_enter_txt dc.b "Break Point reached at address $",0
BPJ_enter_txt dc.b "JSR Break Point reached at address $",0
BP_set_txt dc.b "Break Point set at address $",0
BPJ_set_txt dc.b "JSR Break Point set at address $",0
BP_clr_txt dc.b "Break Point removed at address $",0
all_break_txt dc.b "Break Point at $",0
all_break2_txt dc.b "JSR Break Point at $",0
all_BP_txt dc.b "All Break Points cleared",$a,0
show_txt dc.b "memory address : $",0
break_txt dc.b "Break...",$a,0
drive_txt dc.b "Active drive is now : ",0
no_disk_txt dc.b "No disk in drive ...",$a,0
corrupt_txt dc.b "Track corrupted ...",$a,0
bad_sum_txt dc.b "Bad Block_Checksum ...",$a,0
NotDOS_txt dc.b "Not a DOS disk ...",$a,0
WriteProt_txt dc.b "Disk is write-protected ...",$a,0
Bitmap_txt dc.b "Invalid Bitmap ...",$a,0
NotEmpty_txt dc.b "Directory not empty ...",$a,0
IDEerr_txt dc.b "IDE disk error ...",$a,0
NoFFS_txt dc.b "Not an FFS or Int. FFS disk ...",$a
dc.b "(OFS and DC-FFS not supported)",$a,0
IllegalPath_txt dc.b "Illegal path ...",$a,0
DeviceNotFound_txt dc.b "Device not found ...",$a,0
FileExists_txt dc.b "File already exists ...",$a,0
DiskFull_txt dc.b "Disk full ...",$a,0
FileNotFound_txt dc.b "File not found ...",$a,0
CreateFile_txt dc.b "Can't create file ...",$a,0
unknown_txt dc.b "Unknown command...",$a,0
illegal_syntax_txt dc.b "Illegal syntax...",$a,0
illegal_addr_txt dc.b "Illegal address...",$a,0
illegal_reg_txt dc.b "Illegal register...",$a,0
illegal_val_txt dc.b "Illegal value...",$a,0
illegal_name_txt dc.b "Illegal name...",$a,0
illegal_string_txt dc.b "Illegal string...",$a,0
illegal_expr_txt dc.b "Illegal expression...",$a,0
not_found_txt dc.b "File not found...",$a,0
too_break_txt dc.b "Too many break points...",$a,0
insert_off_txt dc.b "off"
insert_on_txt dc.b "on "
outerr_txt dc.b "Wrong register number...",$a,0
include src/help.s
;--------------------------------------------------------------------
topaz2 incbin "topaz3.raw"
;880*10 Main Font
cnop 0,4
***********************************************************
ascII_mac macro
dcb.b 80*(MAX_SCREEN-3),' ' ;fill with spc.
dc.b "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹"
dc.b "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹"
dc.b "HRTmon V"
version
dc.b " by Alain Malek "
dc.b " "
dc.b \1
dc.b "Track:[00] Drive:[0] Address:[$00000000]"
dc.b " Hrt:[$00000000] Fcpu:[65802] Ins:[Off]"
even
endm
***********************************************************
include src/format_block.s
include src/custom_names.s
include src/vector_names.s
**************************************************************************
**************************************************************************
**************************************************************************
cnop 0,16
inited dc.l 0 ;<>$12345678 then never entered
registres dcb.l 14,0 ;d0-d7,a0-a5
a6_reg dc.l 0
a7_reg dc.l 0
sr_reg dc.w 0
pc_reg dc.l 0
ssp_reg dc.l 0
usp_reg dc.l 0
vbr_reg dc.l 0
cacr_reg dc.l 0
caar_reg dc.l 0 ; or BUSR on 68060
isp_reg dc.l 0
msp_reg dc.l 0 ; or PCR on 68060
tc_reg dc.l 0
end_registres
itt0_reg dc.l 0
itt1_reg dc.l 0
dtt0_reg dc.l 0
dtt1_reg dc.l 0
cnop 0,4
OldRaster dc.l 0 ;old pos of raster beam
proc_type dc.w 2 ;processor type 2=68020,...,6=68060
;keyboard ptr with/without SHIFT, ALT
board_ptr dc.l board3,board4,board4a
;-------------------------------------------
ascII_ptr dc.l ascII_page1 ;ptr on actual ascII page
dc.l ascII_page1 ;list of ptrs on all ascII pages
dc.l ascII_page2
dc.l ascII_Tracer
dc.l 0 ;end signal for multi-print
Reset_Flag dc.w 0 ;Copy of Action_GAL AND %100
trace_count dc.w 0 ;nb of steps to trace
escape dc.b 0 ;escape monitor signal
no_kill dc.b 0 ;don't kill AR on exit (for BP,trace..)
kill dc.b 0 ;Kill cmd done
reboot dc.b 0 ;Reboot cmd done
break_mode dc.b 0 ;0=no break points -1 BP set
BP_reach dc.b 0 ;entered from Illegal breakpoint
BPJ_reach dc.b 0 ;entered from JSR breakpoint
BPatPC dc.b 0 ;BP at PC -> need one trace step
trace_moni dc.b 0 ;Tracer mode ON/OFF
cheat dc.b 0 ;Can access Action-Replay area ?
cheat_cnt dc.b 0 ;counter to enable cheat
pic_status dc.b 0 ;0=low-mem ok. -1=pic in low-mem
VBL dc.b 0 ;set to -1 at each VBL
packed dc.b 0 ;used by LA_cmd
debug_entry dc.b 0 ;1=bus,2=addr,3=illegal,4=zero,5=linea,6=linef
pcmcia_intena dc.b 0 ;backup of pcmcia intena register
cnop 0,4
corr_val dc.l 0 ;offset to add to get the corrected address
;this is inited by the corr_addr procedure
;-------------------------------------------
cnop 0,4
last_cmd dc.l cmd_list ;keep last command
hex_ptr: dc.l 0 ;ptr on last address shown as hexa
dis_ptr: dc.l 0 ;ptr on last addr disassembled
asc_ptr dc.l 0 ;same for ascII dump
time_repeat: dc.w 0
time_cursor: dc.w 0
cursor_x: dc.w 0
cursor_y: dc.w 0
old_cursor: dc.l 0 ;cursor_xy backup for Tracer
print_cnt dc.w 0 ;used in print procedure
ascII_num: dcb.b 8,0
cursor_on: dc.b 0 ;actual cursor state (displayed or not)
no_curs: dc.b 0 ;disable cursor
key: dc.b 0 ;actual key
key_prev: dc.b $7f ;previous key
shift_mode dc.b 0 ;0=no shift key pressed
ctrl_mode dc.b 0 ;0=no ctrl key pressed
alt_mode dc.b 0 ;0=no alt key pressed
amiga_mode dc.b 0 ;0=no amiga key pressed
insert_mode dc.b 0 ;0=no insert -1=insert mode on
break dc.b 0 ;break signal (ESC)
ascII_page dc.b 0 ;0=page1, -1=page2
even
nb_keys dc.w 0
key_buffer dcb.b 64,0
new_key dc.b 0
even
history_cnt dc.w 0 ;last history
history_disp dc.w 0 ;next displayed history
history rept 16
dcb.b 80,0
endr ;16 lines of history
command: dcb.b 80+20,0 ;the actual command line is here
window_top dc.w 0 ;top of actual window
window_bot dc.w 0 ;bottom of actual window (last line)
screen_height dc.w 22 ;nb max of lines (depending of resolution)
small_pic dc.b 0 ;if -1 then only bottom of AR pic is displayed
;(to get some more mem. for DMA-Disk buffer)
no_print dc.b 0 ;if -1 then print won't write in the picture
;memory, only in the ascII_page
cnop 0,4
;-------------- strings which are modified ----------------
registre_txt
data0_reg dc.b "D0=xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx "
data4_reg dc.b "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx",$a
addr0_reg dc.b "A0=xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx "
addr4_reg dc.b "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx",$a
pc_txt dc.b "PC=xxxxxxxx "
ssp_txt dc.b "SSP=xxxxxxxx "
usp_txt dc.b "USP=xxxxxxxx "
vbr_txt dc.b "VBR=xxxxxxxx "
sr_txt dc.b "SR=xxxx "
rts_txt dc.b "RTS=xxxxxxxx",$a
ISP_txt dc.b "ISP=xxxxxxxx "
MSP_txt dc.b "MSP=xxxxxxxx "
CACR_txt dc.b "CACR=xxxxxxxx "
CAAR_txt dc.b "CAAR=xxxxxxxx "
mc_txt dc.b "MC68060",$a,0
hex_txt:
dc.b "h $xxxxxxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx "
hex_txt2 dc.b "' '",$a,0
cnop 0,4
general_txt dcb.b 80,0 ;can be used by anyone to output a line
dc.b $a,0
even
ev_line dcb.b 80,0 ;evaluation output line (for any other use too)
dc.b $a,0
;-------------- Tracer variables ---------------------
cnop 0,4
tracer_old_rts dc.l 0 ;when skiping subroutine
tracer_addr dcb.l MAX_SCREEN-10,-1 ;address disassembled on each line
;of the tracer
actual_pos dc.w -1,-1
tracer_refresh dc.b 0
trace_bsr dc.b 0
;-------------- watch variables ----------------------
watch_txt dcb.b 12," "
watch dc.l 0 ;the thing to watch, ptr or val
;-------------- output cmd variables -----------------
cnop 0,4
output_start dc.l 0
output_ptr dc.l 0
cnop 0,4
;-------------- Q (cmp mem) cmd variables ------------
cmp_start dc.l 0
cmp_end dc.l 0
cmp_dest dc.l 0
;-------------- A (assemble) cmd variables -----------
ass_addr dc.l 0 ;address parameter
;-------------- AF cmd variables ---------------------
af_ptr dc.l 0
;-------------- O (fill mem) cmd variables -----------
fill_start dc.l 0
fill_end dc.l 0
;-------------- E show custom registers --------------
custom_offset dc.l 0
;-------------- trainer variables --------------------
ts_size dc.w -1 ;size used for searching .B .W .L
cnop 0,4
ts_start dc.l 0
ts_end dc.l 0
tf_txt dc.b "$xxxxxxxx ",0
ts_deep dc.b 0 ;deep trainer mode on/off
cnop 0,4
;-------------- DEBUG cmd variables ------------------
cnop 0,4
exc8 dc.l 0 ;backup of
excC dc.l 0 ;exception
exc10 dc.l 0 ;vectors
exc14 dc.l 0 ;when
exc28 dc.l 0 ;in
exc2C dc.l 0 ;debug mode
debug dc.b 0 ;debug mode ON/OFF
;-------------- F,FI,FIF cmds variable ---------------
cnop 0,4
find_start dc.l 0
find_end dc.l 0
find_list dcb.b 80,0
dc.w 0
cnop 0,4
;-------------- RS,WS cmds variables -----------------
sec_addr dc.l 0
strtsec dc.w 0
nbsec dc.w 0
rwsec dc.b 0 ;'R' or 'W' (rs or ws cmd)
cnop 0,4
;-------------- T,TA (trace) cmds variable -----------
old_trace: dc.l 0 ;old trace exception vector
trace_address: dc.l -1 ;used by TA
;-------------- C,CE (copy,exg mem) cmd variables ----
copy_start dc.l 0
copy_end dc.l 0
copy_dest dc.l 0
exgc dc.b 0 ;copy or exg ?
cnop 0,4
;-------------- variables used by read_number procedure ---
minus dc.b 0
ok_numb dc.b 0
label dc.b 0 ;disable label recognition
cnop 0,4
;-------------- variables used for evaluation --------
exit_stack dc.l 0 ;to restore stack after an error
muls_data dc.l 0,0 ;used by muls32 procedure
divs_data dc.l 0,0 ;used by divs32 procedure
eval_size dc.w 0 ;size 0=.b 1=.w 3=.l
cnop 0,4
;-------------- 65816 CPU variables ------------------
fami_mode dc.b 0 ;0=65802 -1=65816
fami_auto dc.b 0 ;automatic switch on/off 0/-1
cnop 0,4
;-------------- breakpoint variables -----------------
illegal_except dc.l 0 ;old illegal exception vector for BP
Break_Address dc.l 0 ;keep address of BP when entering monitor
JB_save dc.l 0,0 ;used by JSR_reach
break_list rept 20 ;20 breakpoints max.
dc.l 0 ;break address
dc.w -1 ;old word
dc.l -1 ;old address for jsr
endr
dc.l -1 ;end
dc.w -1 ;
dc.l -1 ;signals
cnop 0,4
;-------------- variable used by get_dkey procedure --
dkey dc.b 0,0 ;direct key,olddkey
dkey_rep dc.w 0 ;direct key,repeat
dkey_shift dc.b 0 ;direct shift
cnop 0,4
;-------------- Floppy disk variables ----------------
old_head dc.w 0,0,0,0 ;old pos of head (1 for each drive)
sectpos: dc.w 0 ;nb sectors to read in access
startsec: dc.w 0 ;offset of first sector in 1st track
oldsectpos: dc.w 0
oldstartsec: dc.w 0
drive_present dc.b 0,0,0,0 ;floppy drive present
drive: dc.w 3 ;selected floppy disk (3-6)
track: dc.w 0,0,0,0 ;actual pos of head (1 for each drive)
OldAdk: dc.w 0
writes: dc.b 0 ;write floppy accesss ?
init: dc.b 0 ;head pos initied ? (bits 3-6)
mot_on: dc.b 0 ;motor on ? (bits 3-6)
ctrl: dc.b 0 ;end access signal
cnop 0,4
header: dc.l $ff00000b ;MFM header
format dc.b 0
first_sauve dc.b 0
cnop 0,4
drive_err dc.w 0
cnop 0,4
buffer dc.l 0 ;address of DMA disk buffer
;-------------- IDE drive variables ------------------
STRUCTURE IDE_info,0
UWORD II_NbCyl
UWORD II_NbHeads
UWORD II_NbSecTrack
UWORD II_MultSize ;multiple block size
LABEL II_SIZEOF
IDE_info0 dc.w 0 ;NbCyl
dc.w 0 ;NbHeads
dc.w 0 ;NbSecTrack
dc.w 0 ;MultSize
IDE_info1 dc.w 0 ;NbCyl
dc.w 0 ;NbHeads
dc.w 0 ;NbSecTrack
dc.w 0 ;MultSize
IDE_IRQ dc.b 0 ;set when IDE_interrupts found in level2
even
;-------------- part variables -----------------------
cnop 0,4
floppy0: dc.l 0
dc.l 0
dc.l 1760
dc.l floppy_device
dc.w 0 ;unit
dc.b 0,0,0,0 ;for DOS\1,2,3,...
dc.b 3,"DF0"
dcb.b 32-4,0
dcb.b 32,0
floppy1: dc.l 0
dc.l 0
dc.l 1760
dc.l floppy_device
dc.w 1 ;unit
dc.b 0,0,0,0 ;for DOS\1,2,3,...
dc.b 3,"DF1"
dcb.b 32-4,0
dcb.b 32,0
rept 16 ;16 harddisk partition max
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.w 0 ;unit
dc.b 0,0,0,0 ;for DOS\1,2,3,...
dcb.b 32,0
dcb.b 32,0
endr
harddisk_end
;-------------- track buffer to speedup floppy access -----
track_buffer dc.l 0 ;ptr on track buffer (11 sectors)
track_buffer_no dc.w -1 ;no of track in track_buffer (0-159)-1=empty
track_sector dcb.b 12,-1 ;-1 if sector of track_buffer isn't loaded
;(12 values instead of 11 for easier clear)
flush_needed dc.b 0
cnop 0,4
;------------------------------------------------
ascII_page1 ascII_mac "Page_1"
ascII_page2 ascII_mac "Page_2"
ascII_Tracer ascII_mac "Tracer"
;------------------------------------------------
cnop 0,4
custom dcb.w $100,0 ;copy of custom $DFF000-$DFF1FE
CIAA dcb.b 16,0
CIAB dcb.b 16,0
palette
paletteH dcb.w 8*32,0 ;High bits
paletteL dcb.w 8*32,0 ;Low bits
;------------------------------------------------
fbuf1 rept nb_fbuf
dcb.b 512,0 ;file buffers
endr
backup_pic dcb.b LOSIZE,0 ;backup of pic mem
;------------------------------------------------
cnop 0,4
tmp_mem_size equ $8000
tmp_mem dcb.b tmp_mem_size,0
;tmp_mem is used by:
; - Trainer commands
; - copy command (copy a file)
; - d2f command (disk to file) (uses 512*11 first bytes)
; - f2d command (file to disk) (uses 512*11 first bytes)
; - sa command (save all)
; - la command (load all)
; - sp command (save picture)
; - test_CPU routine (uses first $400 bytes)
;(!Trainer buffer can be erased by one of these commands!)
dcb.b $800,0 ;stack area
stack
end
;--------------------------------------------------------------------
;max floppy filesize=1730*512=885760